Обучаю битриксу программистов, интеграторов. Подробнee ⇒

ООП PHP: кратко, примеры, шпаргалка



тут полный туториал, который мне понравился

я себе выписать хочу все в одну страницу
class FirstPerson{ 
    public $name = "Nika";
    public $age = 18;
     
    function displayInfo(){
        echo "Name: $this->name; Age: $this->age<br>";
    }
}

$tom = new FirstPerson();
$tom -> name = "Tom"; //можно указывать, а можно нет
$tom -> age = 25; //можно указывать, а можно нет
$tom -> displayInfo();

$tomas = $tom;
($tom == $tomas) //true (равны по значениям)
($tom === $tomas) //true (указывают на один объект, можно через любой менять свойства объекта)


$tomas = new FirstPerson();
$tomas -> name = "Tom";
$tomas -> age = 25;

($tom == $tomas) //true (равны по значениям)
($tom === $tomas) //false (разные объекты, хоть и равны по значениям )

class SecondPerson{ 
    public $name, $age;

    function __construct($name="Том", $age=36){
        $this->name = $name;
        $this->age = $age;
    }

    function displayInfo(){
        echo "Name: $this->name; Age: $this->age<br>";
    }
    function __destruct(){
       AddMessage2Log($USER);//например
    }
}

$tom = new SecondPerson();
$tom -> displayInfo(); //Name: Том; Age: 36
 
$bob = new SecondPerson("Bob"); 
$bob -> displayInfo(); //Name: Bob; Age: 36
 
$sam = new SecondPerson("Sam", 29);
$sam -> displayInfo(); //Name: Sam; Age: 29
так тоже можно, но читается хуже
class BadPerson{ 
    public $a;
    function __construct($a = 'a', public $name = 'Nika', public $age = false){
        $this->name = $name;
        $this->age = $age;
    }     
    function displayInfo(){
        echo "Name: $this->name; Age: $this->age; A: $this->a<br>";
    }
}
$tom = new BadPerson("a",Tom", 36);
$tom -> displayInfo(); //Name: Том; Age: 36; A: a

Наследование
Свойства и методы бывают
  • public - можно обращаться из внешнего кода и из любой части программы
  • protected - доступны из текущего класса, а также из классов-наследников
  • private - доступны только из текущего класса
class Employee extends SecondPerson{
    public $company;
    private $gender = false;
    const GENDER_NAMES = ["m"=>"man","w"=>"woman"]; //начиная с php 5.6+ 
    private static $counter=0;
    private $id;

    function __construct($name, $age, $company=false,$gender=false)    {
        parent::__construct($name,$age);
        $this->company = $company;
        $this->SetGender($gender);
        self::$counter++;
        $this->id = self::$counter; 
    }

    final function displayInfo(){ //final - Запрет наследования данного метода, обращаться к методу можно, а переопределять нельзя
        parent::displayInfo();
        if(!empty($this->company)){
          echo "Работает в $this->company<br>";
        }
        else{
           echo "Место работы не указано<br>";
        }
        $this->ShowGender();
    }
    function SetGender($gender){
       $this->gender = in_array($gender,["m","w"]) ? $gender : false;         
    }
    function ShowGender(){
        if(!empty($this->gender)){            
           echo self::GENDER_NAMES[$this->gender];
        }        
    }

    static function getCounter(){
        return self::$counter;
    }
}


final class Manager extends Employee{ //final - Запрет наследования всего класса

}
 
$tom = new Employee("Tom", 35, "Microsoft");
$tom->displayInfo();

$tom2 = new Employee("Tom2", 35, "Microsoft","m");
$tom2->displayInfo();

echo "$tom->name имеет id: " . $tom->getId() . "<br>";
echo "$tom2->name имеет id: " . $tom2->getId() . "<br>";
echo "Всего работников: " .  Employee::getCounter();



$tom instanceof Employee;   // true
$tom instanceof SecondPerson;     // true
$tom instanceof Manager; // false 
Интерфейсы
ничего не может включать кроме заголовков публичных методов и публичных констант
https://habr.com/ru/articles/328890/
interface Camera{    
    function makePhoto();
}
interface CameraNew extends Camera{
   //function makePhoto();//можно, но бессмысленно
   //function makePhoto(int $count);//нельзя, фатальная ошибка Declaration must be compatible
   function makePhoto(int $countPhoto = 0);//можно, потому что эта сигнатура совместима с родительской - мы просто добавили необязательный аргумент   
   function makeVideo();

}

interface Messenger{
    function sendMessage($message);
}
 
class Mobile implements CameraNew, Messenger{
    function makeVideo(){ 
        echo "Запись видео";
     }
    function makePhoto(int $count){ 
      echo "Съемка фото ".$count." раз";
    }
    function sendMessage($message) {
       echo "Отправка сообщения $message";
    }
}
$iphone = new Mobile();
$iphone->makePhoto();
Абстрактные классы и методы
abstract class Messenger{
    protected $name;
    
    function __construct($name){ 
        $this->name = $name;
    }
    abstract function send($message);
    function close(){
        echo "Выход из мессенджера...";
    }
}
 
class EmailMessenger extends Messenger{
    function send($message){
        echo "$this->name отправляет сообщение: $message<br>";
    }
}
$outlook = new EmailMessenger("Outlook");
$outlook->send("Hello Nika");
$outlook ->close();

Интерфейсы и Абстрактные классы
разница описана тут

Traits
группа методов, которые могут быть добавлены в классы
могут содержать только статические и нестатические методы
при наследовании методы трейта переопределяют унаследованные методы с тем же именем
class Data{
    function print() { echo "Print from Data"; }
}

trait Printer{
    function print() { echo "Print from Printer"; }
}
 
class Message extends Data{
    use Printer; 
}

$myMessage = new Message();
$myMessage->print();     // Print from Printer
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!