Новый self против нового static
Я конвертирую библиотеку с PHP 5.3, чтобы она работала на PHP 5.2. Основной проблемой, с которой я сталкиваюсь, является использование позднего статического связывания, например, return new static($options);
. Если я заменю это на return new self($options);
, получу ли я тот же результат?
Какова разница между new self
и new static
?
2 ответ(ов)
Если метод этого кода не является статическим, вы можете использовать get_class($this)
в качестве обходного решения в PHP 5.2.
Вот пример:
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"
Как видно, оба метода create1()
и create2()
возвращают экземпляр класса B
. Метод create1()
создает новый объект, используя get_class($this)
, что гарантирует создание экземпляра текущего класса, а метод create2()
использует static
, что также ссылается на класс B
из-за механизма позднего статического связывания. Это демонстрирует, что оба варианта работают корректно для динамического создания объектов текущего класса.
В дополнение к ответам других пользователей:
static::
будет вычисляться с использованием информации во время выполнения. Это означает, что вы не можете использовать static::
в значениях свойств класса, потому что значения свойств:
Должны быть вычисляемыми на этапе компиляции и не должны зависеть от информации во время выполнения.
class Foo {
public $name = static::class;
}
$Foo = new Foo;
echo $Foo->name; // Фатальная ошибка
Используя self::
:
class Foo {
public $name = self::class;
}
$Foo = new Foo;
echo $Foo->name; // Foo
Обратите внимание, что комментарий о фатальной ошибке в моем коде не указывает конкретно, где произошла ошибка, она случилась ранее, до создания объекта, как упомянул @Grapestain в комментариях.
UTF-8 на всех уровнях!
Сортировка двумерного массива по значению в столбце
Каков эквивалент статических методов Java в Kotlin?
Как передать переменные и данные из PHP в JavaScript?
Вставка нового элемента в массив в любом месте в PHP