Новая личность против новой статики
Я конвертирую библиотеку PHP 5.3 для работы на PHP 5.2. Главное, что стоит у меня на пути - это использование поздних статических привязок вроде return new static($options);
, если я преобразую это в return new self($options)
я получу те же результаты?
В чем разница между new self
а также new static
?
3 ответа
я получу те же результаты?
На самом деле, нет. Я не знаю обходного пути для 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"
В дополнение к ответам других:
static:: будет вычислено с использованием информации времени выполнения.
Это означает, что вы не можете использовать static::
в свойстве класса, потому что значения свойств:
Должен быть в состоянии быть оцененным во время компиляции и не должен зависеть от информации времени выполнения.
class Foo {
public $name = static::class;
}
$Foo = new Foo;
echo $Foo->name; // Fatal error
С помощью self::
class Foo {
public $name = self::class;
}
$Foo = new Foo;
echo $Foo->name; // Foo