я себе выписать хочу все в одну страницу
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 |
Наследование
Свойства и методы бывают
|
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 |