vou obter os mesmos resultados?
Na verdade não. Eu não sei de uma solução alternativa para o PHP 5.2, no entanto.
Qual é a diferença entre new self
e new static
?
self
refere-se à mesma classe em que a new
palavra-chave é realmente escrita.
static
, nas ligações estáticas tardias do PHP 5.3, refere-se a qualquer classe na hierarquia em que você chamou o método.
No exemplo a seguir, B
herda os dois métodos de A
. A self
invocação está vinculada a, A
porque é definida na A
implementação do primeiro método, enquanto static
está vinculada à classe chamada (também consulte 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()
, o que é efetivamente o mesmo que__CLASS__
, mas compatível com LSB.self
retornaria a si próprio estatic
retornaria algo que não pode ser substituído ... Mas eis que é o contrário. Eu nunca deixo de me impressionar com a nomeação, convenções e estilo geral do PHP. #Se o método desse código não for estático, você pode obter uma solução alternativa na 5.2 usando
get_class($this)
.Os resultados:
fonte
clone
, mas apenas recriando e configurando as propriedades.$copy = new static(); $copy->set($this->get()); return $copy;
self::
oustatic::
afetará se a versão da classe base ou subclasse desse método estático é usada. Na ausência de algum motivo para pensar que tal situação ocorra indica inerentemente má prática (e não vejo nenhuma razão para que isso aconteça), a escolha entreself::
estatic::
é tão relevante dentro de métodos não estáticos quanto em métodos estáticos. Eu entendi mal o seu comentário, ou alguém está simplesmente errado?Além das respostas dos outros:
Isso significa que você não pode usar
static::
em uma propriedade de classe porque os valores das propriedades:Usando
self::
fonte
public $name = static::class;
, não na linha 7, conforme sugerido pelo exemplo. O erro diz: "static :: class não pode ser usado para resolução de nomes de classes em tempo de compilação", o que indica que o problema não é onde você tenta acessar o campo $ name, mas muito antes, na compilação da classe PHP. A linha 7 (ou 6) não será alcançada no primeiro exemplo.