2016-01-02 5 views
2

Может ли кто-нибудь сказать мне, как конструктор объектов «старого стиля» отличается от конструктора «нового стиля»? Я изучаю PHP OOP, и я хочу знать, когда я читаю старый синтаксис против нового синтаксиса и лучше понимаю, как OOP изменился в PHP с течением времени.Разница между конструкторами PHP старого и нового стиля

Новый стиль

class aObject 
{ 
    public $name; 

    public function __construct($name) 
    { 
     $this->name = $name; 
    } 
} 
+1

Отличие состоит в том, что старый объект использовал метод с тем же именем класса, что и конструктор, новый объект использует «магический» метод, называемый '__construct()' .... но старый действительно старый, был устарел почти 10 лет и теперь полностью заменен новым методом –

+0

@Mark Baker Спасибо, поэтому он отклонился от конструкции C++? –

+0

Это все объясняется в документации! Почему бы вам просто не прочитать его? – arkascha

ответ

5

"Старый" синтаксис конструктора со ссылкой на 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.