я получу те же результаты?
На самом деле, нет. Хотя я не знаю обходного пути для PHP 5.2.
В чем разница между new self
и new static
?
self
относится к тому же классу, в котором new
ключевое слово фактически написано.
static
в поздних статических привязках PHP 5.3 относится к любому классу в иерархии, для которой вы вызвали метод.
В следующем примере B
оба метода наследуются от A
. self
Вызов связан с , A
потому что это определено в A
реализации «S первого способа, в то время как 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
get_called_class()
, что фактически совпадает с__CLASS__
LSB-совместимостью.self
вернет себя иstatic
вернет что-то, что не может быть переопределено ... Но вот и все наоборот. Я никогда не перестаю удивляться именам, соглашениям и общему стилю PHP. -_-Если метод этого кода не статичен, вы можете обойти его в 5.2 с помощью
get_class($this)
.Результаты:
источник
clone
, а просто путем повторного создания и установки свойств.$copy = new static(); $copy->set($this->get()); return $copy;
self::
илиstatic::
будет влиять на то, используется ли версия этого статического метода базовым классом или подклассом. В отсутствие какой-либо причины полагать, что такая ситуация по своей сути указывает на плохую практику (и я не вижу никаких причин, почему это должно быть так), выбор междуself::
иstatic::
столь же уместен в нестатических методах, как и в статические методы. Я неправильно понял ваш комментарий или один из нас просто неправ?В дополнение к ответам других:
Это означает, что вы не можете использовать
static::
в свойстве класса, потому что значения свойств:С помощью
self::
источник
public $name = static::class;
, а не в строке 7, как показано в примере. В сообщении об ошибке говорится: «static :: class нельзя использовать для разрешения имен классов во время компиляции», что указывает на то, что проблема заключается не в том, где вы пытаетесь получить доступ к полю $ name, а гораздо раньше - при компиляции класса PHP. Строка 7 (или 6) не будет достигнута в первом примере.