oop — Разница между старыми и новыми стилями конструкторов PHP

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

Новый стиль

class aObject
{
public $name;

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

4

Решение

Синтаксис «старого» конструктора относится к 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.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]