тут полный туториал, который мне понравился
я себе выписать хочу все в одну страницу
так тоже можно, но читается хуже
Наследование
Интерфейсы
ничего не может включать кроме заголовков публичных методов и публичных констант
https://habr.com/ru/articles/328890/
Абстрактные классы и методы
Интерфейсы и Абстрактные классы
разница описана тут
Traits
группа методов, которые могут быть добавлены в классы
могут содержать только статические и нестатические методы
при наследовании методы трейта переопределяют унаследованные методы с тем же именем
я себе выписать хочу все в одну страницу
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 |