"Старый" синтаксис конструктора со ссылкой на 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 представил method and property visibility, что позволяет использовать «контроль доступа» для методов и свойств этого класса. Доступны только методы и свойства, отмеченные как 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
). Итак, как бы вы использовали такой класс? Ну, static methods, конечно:
<?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()
и т.д. называются magic methods.
PHP5 принес много dramatic changes, но в основном пытался поддерживать совместимость с кодом PHP4, и, таким образом, конструкторы старого стиля по-прежнему допускались.
PHP7 теперь выпущен в этом году без изменений в синтаксисе конструктора. Единственное существенное изменение в PHP7 было связано с использованием анонимных классов (см. here).
Начиная с PHP7, конструкторы старого стиля are officially deprecated (вызывает ошибку E_DEPRECATED
) и будут полностью удалены в PHP8.
Отличие состоит в том, что старый объект использовал метод с тем же именем класса, что и конструктор, новый объект использует «магический» метод, называемый '__construct()' .... но старый действительно старый, был устарел почти 10 лет и теперь полностью заменен новым методом –
@Mark Baker Спасибо, поэтому он отклонился от конструкции C++? –
Это все объясняется в документации! Почему бы вам просто не прочитать его? – arkascha