что оно может и умеет, какие у него есть характеристики. Класс можно назвать шаблоном, по которому созданы объекты. • Объект — экземпляр класса, конкретная сущность, созданная по шаблону (классу).
+ 5/12; &// expression, scalar or array; not null function displayMaxAge() { echo 'Max dog age: ' . self&::MAX_AGE; } function isRecordBeat() { return $this&->age > self&::MAX_AGE; } } $sharik = new Dog; $sharik&->age = 30; $sharik&->displayMaxAge(); if ($sharik&->isRecordBeat()) echo 'This is a new record!';
'Hello, '; } function &__destruct() { echo 'World!'; } } $a = new Animal; $a = false; &// в данном скрипте эту строку можно убрать, &// деструктор сработает при завершении скрипта
Создать объект класса снаружи невозможно } } $a = new Animal; &// Fatal Error В таком варианте объект можно создать клонированием или восстановлением через unserialize();
private function &__construct() {} private function &__clone() {} private function &__wakeup() {} static public function getInstance() { return self&::$instance &?? (self&::$instance = new static()); } }
public final function displayInfo() { echo $this&->name . ': ' . $this&->age; } } class Cat extends Animal { public function displayInfo() { &// Fatal Error echo 'Кот: '; parent&::displayInfo(); } } &// Другие (не-final) функции можно переопределять
быть переопределены в дочерних классах • нельзя создать объект абстрактного класса • если дочерний класс определяет не все абстрактные методы родительского, он тоже является абстрактным
abstract public function getFullName(); public function getName() { echo $this&->name; } } class Dog extends Animal { public function getFullName() { echo 'Собака: '; self&::getName(); } } $sharik = new Dog; $sharik&->name = 'Шарик'; $sharik&->getFullName(); &// Собака: Шарик
классе, включающем интерфейс • не содержит никакого кода и свойств (абстрактный класс может содержать код и свойства) • определяет только публичные методы • интерфейсы можно расширять через extends
} class Dog implements IAnimal { public function getType() { return 'Dog'; } public function move() { self&::run(); &// some inner function echo 'I like to move it, move it!'; } }
{ public function swim(); } class Cat implements Runnable { &&... } class Fish implements Swimmable { &&... } class Dog implements Runnable, Swimmable { &&... }
Набор функций и переменных, которые можно «подключить» и использовать в собственном классе. • Нужны для того, чтобы исправить ограничение PHP на наследование только от одного класса. • Методы trait-ов перегружают методы родительских классов. Методы текущего класса перегружают методы подключенных trait-ов.
1; } } class Base { public function show() { echo 2; } } class Child extends Base { use A; public function show() { echo 3; } } $var = new Child; $var&->show(); &// 3
&&... } public function hide() { &&... } } trait B { public function show() { &&... } public function hide() { &&... } } class C { use A, B; &// Fatal Error }
&&... } public function hide() { &&... } } trait B { public function show() { &&... } public function hide() { &&... } } class C { use A, B { A&::show insteadof B; B&::hide insteadof A; } }
&&... } public function hide() { &&... } } trait B { public function show() { &&... } public function hide() { &&... } } class C { use A, B { A&::show as AShow; A&::hide as AHide; } }
public $variable = 10; } class A { use SomeTrait; } echo A&::$variable; &// 10 echo (new A)&->someVar; &// 5 В классе нельзя определить переменную с тем же именем, что и у Trait-а, кроме случая, когда переменная имеет тот же тип и то же начальное значение.
&// их можно «наследовать» abstract public function functionName(); &// объявлять в них абстрактные функции } class A { use SomeTrait { functionName as private; &// можно менять функциям trait-ов &// область видимости otherFunctionName as protected someNewName; &// и имена } }
private function &__construct() {} private function &__clone() {} private function &__wakeup() {} static public function getInstance() { return self&::$instance &?? (self&::$instance = new static()); } } class LochNessMoster { use Singletone; } class Zeus { use Singletone; }
= 3; &// тут вызова &__set() не будет $list&->hidden = 4; &// тут не возникнет Fatal Error echo $list&->hidden; &// и тут не возникнет echo isset($list&->a) ? 'isset' : 'not set’; &// isset unset($list&->a); echo isset($list&->a) ? 'isset' : 'not set’; &// not set
перед сериализацией и возвращает &// массив имён свойств, которые разрешено &// сериализовать public function &__sleep() { return ['name', 'breed']; } &// срабатывает после десериализации &// полезен для восстановления любых ресурсов &// (соединения с БД и т.п.) public function &__wakeup() {} } $a = new Dog; $a&->name = 'Шарик'; $a&->age = 10; $a&->breed = 'Шпиц'; echo serialize($a); &// O:3:"Dog":2:{s:4:"name";s:10:"Шарик";s: 5:"breed";s:8:"Шпиц";}
при попытке использовать объект &// как строку public function &__toString() { return $this&->name; } } $a = new Dog; $a&->name = 'Шарик'; $a&->age = 10; echo $a; &// Шарик
свойств с одинаковыми значениями (сравниваются тоже через ==) и являются экземплярами одного класса. • Объекты идентичны (===), когда сравниваются ссылки на один и тот же экземпляр класса. $a = new Sheep; $b = $a; $a === $b;
class Animal { public static function whoami() { echo &__CLASS&__; } public static function showMe() { self&::whoami(); } } class Cat extends Animal { public static function whoami() { echo &__CLASS&__; } } Cat&::showMe(); &// Animal
выполнения class Animal { static function whoami() { echo &__CLASS&__; } public static function showMe() { static&::whoami(); } } class Cat extends Animal { static function whoami() { echo &__CLASS&__; } } Cat&::showMe(); &// Cat
static function whoami() { echo &__CLASS&__; } public static function showMe() { static&::whoami(); } } class Cat extends Animal { private static function whoami() { echo &__CLASS&__; } } Cat&::showMe(); &// Fatal Error: &// Access level must be public