Я конвертирую библиотеку 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"
clone
, а просто путем повторного создания и установки свойств. $copy = new static(); $copy->set($this->get()); return $copy;
от $copy = new static(); $copy->set($this->get()); return $copy;
get_called_class()
, который фактически совпадает с__CLASS__
, но совместим с LSB.