Может кто-нибудь сказать мне, как конструктор объекта «старого стиля» отличается от конструктора «нового стиля»? Я изучаю PHP OOP, и я хочу знать, когда я читаю старый синтаксис против нового синтаксиса, и лучше понять, как OOP изменился в PHP с течением времени.
Новый стиль
class aObject
{
public $name;
public function __construct($name)
{
$this->name = $name;
}
}
Синтаксис «старого» конструктора относится к PHP4. Последний выпуск PHP4 был в 2008 году, а первый выпуск PHP5 был в 2004 году. Это пример класса старого стиля и класса нового стиля.
Старый (PHP4)
<?php
class MyOldClass
{
var $foo;
function MyOldClass($foo)
{
$this->foo = $foo;
}
function notAConstructor()
{
/* ... */
}
}
Новый (PHP5 +)
<?php
class MyNewClass
{
var $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
public function notAConstructor()
{
/* ... */
}
}
Вы заметите пару вещей здесь. Наиболее существенным изменением является то, что канонический способ назвать конструктор изменился с ClassName()
в __construct()
, Это дает всем конструкторам классов одинаковое, предсказуемое имя — необходимое удобство. Представьте, что у вас был класс под названием ParentClass
с 20 детьми, каждый со своими конструкторами. Если вы хотите вызвать родительский конструктор из каждого дочернего класса, вы бы ParentClass::ParentClass()
, Если вы хотите изменить имя ParentClass
вам нужно изменить все 20 вызовов конструктора. Но с новым методом вы бы просто parent::__construct()
, который всегда будет работать, даже если имя родительского класса меняется.
В связи с этим изменением PHP5 также представил класс деструкторы (__destruct()
), который вызывается, когда объект уничтожается (противоположность конструктора).
Другое ключевое изменение заключается в том, что PHP5 представил видимость метода и свойства который допускает своего рода «контроль доступа» для методов и свойств класса. Отмечены только методы и свойства public
Доступ к cam можно получить вне контекста класса или его детей. Вот примеры этого:
<?php
class StackOverflow
{
/* This can be accessed from anywhere.
*
* You can access it from outside the class:
* $so = new StackOverflow();
* $so->publicProperty = 10;
* echo $so->publicProperty;
*
* Or from inside the class:
* $this->publicProperty = 5;
* echo $this->publicProperty;
*/
public $publicProperty = 1;
/* This can be accessed only from methods inside this class.
*
* $this->privateProperty = 5;
* echo $this->privateProperty;
*
* You cannot access it from outside the class, as above.
* Private properties cannot be accessed from child classes,
* either.
*/
private $privateProperty = 2;
/* This can be accessed only from methods inside this class,
* OR a child-class.
*
* $this->protectedProperty = 5;
* echo $this->protectedProperty;
*
* You cannot access it from outside the class, as with public.
* You can, however, access it from a child class.
*/
protected $protectedProperty = 3;
}
Теперь методы работают точно так же. Вы можете пометить функцию (метод) в классе как public
, private
, или же protected
, В PHP4 все члены класса были неявно public
, Аналогично, конструктор (__construct()
), так же может быть public
, private
, или же protected
!
Если класс не содержит общественности конструктор, это не может быть создан с помощью кода вне класса (или его дети, для protected
). Так как бы вы использовали такой класс? Что ж, статические методы, конечно:
<?php
class ClassWithPrivateConstructor
{
private $foo;
private function __construct($foo)
{
$this->foo = $foo;
}
public static function fromBar($bar)
{
$foo = do_something_to($bar);
return new self($foo);
}
}
Чтобы создать экземпляр этого класса откуда-то еще, вы должны позвонить:
$obj = ClassWithPrivateConstructor::fromBar($bar);
Это может быть полезно, когда вам нужно предварительно обработать ввод перед вызовом конструктора или когда вам нужно несколько конструкторов, которые принимают разные параметры.
Названия этого метода, __construct()
и другие имена методов, начинающиеся с __
, лайк __get()
, __set()
, __call()
, __isset()
, __unset()
, __toString()
и т. д. называются магические методы.
PHP5 принес много драматические изменения, но в основном пытались поддерживать совместимость с кодом PHP4, и, таким образом, конструкторы старого стиля все еще были разрешены.
PHP7 был выпущен в этом году без изменений в синтаксисе конструктора. Единственное значимое class
связанное с этим изменение в PHP7 должно было разрешить использование анонимных классов (см. Вот).
Начиная с PHP7, конструкторы старого стиля официально устарели (повышения E_DEPRECATED
ошибка), и будет полностью удален в PHP8.
Других решений пока нет …