Това е първата ми публикация в Medium. Надявам се, че това не ви създава неудобства по никакъв начин.
Съдържание
- Клас, обект, метод и свойство
- $тази ключова дума
- Верижно свързване на методите
- Модификатор на достъп
- Магически метод и константа
- Наследство
- Замяна
- Абстрактен клас и метод
- Интерфейс
- Полиморфизъм
- Подсказване на типа
- Статичен метод и свойство
- Характерна черта
Клас, обект, метод и свойство
- Класът е като план като дизайн на автомобил, от който може да се създаде обект.
- Обектът е екземпляр на класа, както BMW е екземпляр на автомобила.
- Функциите вътре в класа се наричат методи.
- Променливите в класа се наричат свойства.
<?php // Declare the class class Car { // Properties public $comp; public $color = 'beige'; public $hasSunRoof = true; // Method that says hello public function hello() { return "beep"; } } // Create an instance with new keyword $bmw = new Car(); $mercedes = new Car(); // Get the values echo $bmw->color; // beige echo "<br />"; echo $mercedes->color; // beige echo "<hr />"; // Set the values $bmw->color = 'blue'; $bmw->comp = "BMW"; $mercedes->comp = "Mercedes Benz"; // Get the values again echo $bmw->color; // blue echo "<br />"; echo $mercedes->color; // beige echo "<br />"; echo $bmw->comp; // BMW echo "<br />"; echo $mercedes->comp; // Mercedes Benz echo "<hr />"; // Use the methods to get a beep echo $bmw->hello(); // beep echo "<br />"; echo $mercedes->hello(); // beep
$тази ключова дума
- $тази ключова дума показва собствен клас. Собствените методи и свойства могат да бъдат достъпни чрез $this ключова дума.
<?php class Car { // The properties public $comp; public $color = 'red'; public $hasSunRoof = true; // The method that says hello public function hello() { // accessing own properties and methods using $this return "Beep, I am a " . $this->comp . ", and my color is" . $this->color. ". I am created at " . $this->model() . "."; } public function model() { return date('Y'); } } // We can now create an object from the class. $bmw = new Car(); $mercedes = new Car(); // Set the values of the class properties. $bmw->color = 'blue'; $bmw->comp = "BMW"; $mercedes->comp = "Mercedes Benz"; // Call the hello method. echo $bmw->hello(); echo $mercedes->hello();
Верижно свързване на методите
- Когато методите на клас върнат $тази ключова дума, те могат да бъдат свързани заедно.
<?php class Car { public $tank; // Add gallons of fuel to the tank when we fill it. public function fill($float) { $this->tank += $float; return $this; } // Substract gallons of fuel from the tank as we ride the car. public function ride($float) { $miles = $float; $gallons = $miles / 50; $this->tank -= $gallons; return $this; } } // Create a new object from the Car class. $bmw = new Car(); // Add 10 gallons of fuel, then ride 40 miles, // and get the number of gallons in the tank. $tank = $bmw->fill(10)->ride(40)->tank; // Print the results to the screen. echo "The number of gallons left in the tank: " . $tank . " gal.";
Модификатор на достъп
- Модификаторите за достъп добавят капсулиране към свойствата и методите на класа, което означава, че декларира видимостта на свойствата и методите.
- Модификаторите за достъп са публични, частни и защитени.
- Публичният модификатор позволява на код извън или вътре в класа да има достъп до методите и свойствата на класа.
- Частният модификатор предотвратява достъпа до методите или свойствата на клас от всеки код, който е извън класа.
- Защитен модификатор, който позволява използването на код както вътре в класа, така и от неговите дъщерни класове.
<?php class Car { // Private access modifier denies access to the property and method from outside the class’s scope private $model; // Public access modifier allows the access from outside the class public function setModel($model) { $this->model = $model; } public function getModel() { return "The car model is " . $this->model; } } $mercedes = new Car(); //Sets the car’s model $mercedes->setModel("Mercedes benz"); //Gets the car’s model echo $mercedes->getModel();
Магически метод и константа
- „Магическите“ методи са такива със специални имена, започващи с две долни черти, които обозначават методи, които ще бъдат задействани в отговор на определени PHP събития.
- PHP предоставя набор от специални предварително дефинирани константи, които се променят в зависимост от това къде се използват. Тези константи се наричат магически константи, започват и завършват с две долни черти.
<?php class Car { private $model = ''; // __construct magic method public function __construct($model = null) { if ($model) { $this->model = $model; } } public function getCarModel() { // We use the __CLASS__ magic constant in order to get the class name return " The <b>" . __class__ . "</b> model is: " . $this->model; } } $car1 = new Car('Mercedes'); echo $car1->getCarModel();
Наследство
- При наследяването имаме родителски клас със свои собствени методи и свойства и дъщерен клас (или класове), който може да използва кода от родителя.
<?php // The parent class class Car { // The $model property is protected, so it can be accessed // from within the class and its child classes protected $model; // Public setter method public function setModel($model) { $this->model = $model; } } // The child class class SportsCar extends Car { public function hello() { // Has no problem to get a protected property that belongs to the parent return "beep! I am a <i>" . $this->model . "</i><br />"; } } // Create an instance from the child class $sportsCar1 = new SportsCar(); // Set the class model name $sportsCar1->setModel('Mercedes Benz'); // Get the class model name echo $sportsCar1->hello();
Замяна
- Дъщерният клас може да има свои собствени свойства и методи, същите като родителския, той може да замени свойствата и методите на родителския клас.
- За да предотвратим метода в дъщерния клас да замени методите на родителя, можем да префиксираме метода в родителя с ключовата дума final.
<?php // The parent class has hello method that returns "beep". class Car { // Child class can override this method public function hello() { return "beep"; } // Prevents the child class from overriding final public function tryToOverride() { return "try hard"; } } // The child class has hello method that returns "Hallo" class SportsCar extends Car { public function hello() { return "Hallo"; } // This code will throw PHP Fatal error: "Cannot override" // public function tryToOverride() // { // return "trying for lifetime"; // } } // Create a new object $sportsCar1 = new SportsCar(); // Get the result of the hello method echo $sportsCar1->hello();
Абстрактен клас и метод
- Абстрактен клас е клас, който съдържа поне един абстрактен метод, който е метод без действителен код в него, само името и параметрите, и който е маркиран като „абстрактен“.
- Целта на това е да предостави един вид шаблон за наследяване и да принуди наследяващия клас да внедри абстрактните методи.
- Когато наследявате от абстрактен клас, всички методи, отбелязани като абстрактни в декларацията на родителския клас, трябва да бъдат дефинирани от детето; освен това, тези методи трябва да бъдат дефинирани със същата (или по-малко ограничена) видимост. Например, ако абстрактният метод е дефиниран като защитен, изпълнението на функцията трябва да бъде дефинирано като защитено или публично, но не и частно
- Абстрактен клас не може да бъде създаден с нова ключова дума
- Следователно абстрактен клас е нещо средно между обикновен клас и чист интерфейс.
<?php // Abstract classes are declared with the abstract keyword, and contain abstract methods. abstract class Car { // Abstract classes can have properties protected $tankVolume; // Abstract classes can have non abstract methods public function setTankVolume($volume) { $this->tankVolume = $volume; } // Abstract method abstract public function calcNumMilesOnFullTank(); } class Toyota extends Car { // Since we inherited abstract method, we need to define it in the child class, // by adding code to the method's body. public function calcNumMilesOnFullTank() { return $miles = $this->tankVolume * 33; } public function getColor() { return "beige"; } } $toyota1 = new Toyota(); $toyota1->setTankVolume(10); echo $toyota1->calcNumMilesOnFullTank();//330 echo $toyota1->getColor();//beige
Интерфейс
- Също така интерфейсите са специален случай на абстрактни класове, където ВСИЧКИ методи са абстрактни (празно тяло).
- Един клас може да имплементира (не да разширява) повече от един интерфейс, като по този начин можем да симулираме множество наследявания в PHP.
- Внедряването на интерфейс гарантира, че всички функции вътре в интерфейса се изпълняват от класа
- Един интерфейс може да разшири друг интерфейс и по този начин да наследи всички функции, декларирани с този интерфейс.
- Интерфейсите могат да имат константи, но не и свойства
<?php interface Car { // Can include public abstract methods and constants public function setModel($name); public function getModel(); } interface Vehicle { public function setHasWheels($bool); public function getHasWheels(); } class miniCar implements Car, Vehicle { // Implements interface methods and may have its own code private $model; private $hasWheels; public function setModel($name) { $this->model = $name; } public function getModel() { return $this->model; } public function setHasWheels($bool) { $this->hasWheels = $bool; } public function getHasWheels() { return ($this->hasWheels) ? "has wheels" : "no wheels"; } public function talk() { return "wow"; } }
Полиморфизъм
- Полиморфизмът представлява повече от една форма, той може да бъде постигнат чрез претоварване на метода и отмяна на метода. Това е обектно ориентирана концепция, при която една и съща функция може да се използва за различни цели. Например името на функцията ще остане същото, но ще приема различен брой аргументи (претоварване) и може да изпълнява различни задачи (преодоляване).
- PHP не поддържа традиционно претоварване на методите, но един от начините, по които можете да постигнете това, което искате, е да използвате магическия метод __call.
<?php // According to the Polymorphism principle, methods in // different classes that do similar things should have the same name interface Shape { public function calcArea(); } class Circle implements Shape { private $radius; public function __construct($radius) { $this->radius = $radius; } // calcArea calculates the area of circles public function calcArea() { return $this->radius * $this->radius * pi(); } } class Rectangle implements Shape { private $width; private $height; public function __construct($width, $height) { $this->width = $width; $this->height = $height; } // calcArea calculates the area of rectangles public function calcArea() { return $this->width * $this->height; } } $circ = new Circle(3); $rect = new Rectangle(3, 4); echo $circ->calcArea(); echo $rect->calcArea();
Подсказване на типа
- С Type hinting можем да посочим очаквания тип данни (масиви, обекти, интерфейс и т.н.) за аргумент в декларация на функция.
<?php // With Type hinting we can specify the expected data type // (arrays, objects, interface, etc.) for an argument in a function declaration class Car { protected $driver; protected $model; protected $hasSunRoof; protected $numberOfDoors; protected $price; // The constructor can only get Driver objects as arguments. public function __construct(Driver $driver) { $this->driver = $driver; } // string type hinting public function setModel(string $model) { $this->model = $model; } // boolean type hinting public function setHasSunRoof(bool $value) { $this->hasSunRoof = $value; } // integer type hinting public function setNumberOfDoors(int $value) { $this->numberOfDoors = $value; } // float type hinting public function setPrice(float $value) { $this->price = $value; } } class Driver { } // Car accepts Driver type $driver1 = new Driver(); $car1 = new Car($driver1); $car1->setModel('BMW'); $car1->setHasSunRoof(true); $car1->setNumberOfDoors(4); $car1->setPrice(1234.56);
Статичен метод и свойство
- Понякога е полезно, ако имаме достъп до методи и свойства в контекста на клас, а не чрез създаване на обект. За да направим това, можем да използваме статична ключова дума.
<?php class Utilis { // Declaring class properties or methods as static makes them // accessible without needing an instantiation of the class. public static $numCars = 0; public static function addToNumCars($int) { $int = (int)$int; self::$numCars += $int; } } echo Utilis::$numCars; Utilis::addToNumCars(3); echo Utilis::$numCars; Utilis::addToNumCars(-1); echo Utilis::$numCars;
Характерна черта
- Характеристиката е просто група от методи, които искате да включите в друг клас.
- Traits е механизъм за повторно използване на код в езици с единично наследяване като PHP. Характеристиката има за цел да намали някои ограничения на единичното наследяване, като позволи на разработчика да използва повторно набори от методи свободно в няколко независими класа, живеещи в различни йерархии на класове.
- Характеристика, подобно на абстрактен клас, не може да бъде създадена сама по себе си
<?php // Traits are a mechanism for code reuse in single inheritance languages such as PHP // Reuse sets of methods from trait freely in several independent classes trait Hello { public function sayHello() { echo 'Hello '; } } trait World { public function sayWorld() { echo 'World'; } } class MyHelloWorld { // Multiple Traits Usage use Hello, World; public function sayExclamationMark() { echo '!'; } } $o = new MyHelloWorld(); $o->sayHello(); $o->sayWorld(); $o->sayExclamationMark();
Благодаря за отделеното време.
GitHub връзка: https://github.com/pollmix/oop-php