Това е първата ми публикация в 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