Я конвертирую библиотеку PHP 5.3 для работы на PHP 5.2. Главное, что стоит на моем пути, – использовать позднюю статическую привязку, такую как return new static($options);
, если я преобразую это, чтобы return new self($options)
, я получу те же результаты?
В чем разница между new self
и new static
?
получаю ли я те же результаты?
На самом деле, нет. Однако я не знаю об обходном пути для PHP 5.2.
В чем разница между
new self
иnew static
?
self
относится к тому же классу, в котором написано new
ключевое слово.
static
, в поздних статических привязках PHP 5.3 относится к любому классу в иерархии, которую вы назвали методом.
В следующем примере B
наследует оба метода из A
self
вызов привязан к A
потому что он определен в реализации A
первого метода, тогда как static
связан с вызываемым классом (также см. get_called_class()
).
class A { public static function get_self() { return new self(); } public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_self()); // A echo get_class(B::get_static()); // B echo get_class(A::get_self()); // A echo get_class(A::get_static()); // A
Если метод, в котором находится этот код, не является статическим, вы можете получить обход в 5.2 с помощью get_class($this)
.
class A { public function create1() { $class = get_class($this); return new $class(); } public function create2() { return new static(); } } class B extends A { } $b = new B(); var_dump(get_class($b->create1()), get_class($b->create2()));
Результаты:
string(1) "B" string(1) "B"