¿obtendré los mismos resultados?
Realmente no. Sin embargo, no conozco una solución alternativa para PHP 5.2.
¿Cuál es la diferencia entre new self
y new static
?
self
se refiere a la misma clase en la que la new
palabra clave se escribe realmente.
static
, en los enlaces estáticos tardíos de PHP 5.3, se refiere a cualquier clase en la jerarquía en la que invocó el método.
En el siguiente ejemplo, B
hereda ambos métodos de A
. La self
invocación está vinculada A
porque se define en A
la implementación del primer método, mientras que static
está vinculada a la clase llamada (también ver 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()
, que es efectivamente el mismo__CLASS__
pero compatible con LSB.self
regresaría a sí mismo ystatic
devolvería algo que no puede ser anulado ... Pero mira y es todo lo contrario. Nunca dejo de sentirme impresionado por los nombres, las convenciones y el estilo general de PHP. -_-Si el método de este código no es estático, puede obtener una solución en 5.2 utilizando
get_class($this)
.Los resultados:
fuente
clone
, pero simplemente recreando y configurando las propiedades.$copy = new static(); $copy->set($this->get()); return $copy;
self::
ostatic::
afectará si se utiliza la versión de la clase base o la subclase de ese método estático. En ausencia de alguna razón para pensar que tal situación ocurra inherentemente indica mala práctica (y no veo ninguna razón por la cual esto sea así), la elección entreself::
ystatic::
es tan relevante dentro de los métodos no estáticos como lo es en métodos estáticos ¿He entendido mal su comentario, o uno de nosotros simplemente está equivocado?Además de las respuestas de otros:
Eso significa que no puede usar
static::
en una propiedad de clase porque los valores de las propiedades:Utilizando
self::
fuente
public $name = static::class;
, no en la línea 7, como sugiere el ejemplo. El error dice: "la clase static :: no se puede usar para la resolución del nombre de la clase en tiempo de compilación", lo que indica que el problema no es donde intenta acceder al campo $ name, sino mucho antes, en la compilación de la clase PHP. La línea 7 (o 6) no se alcanzará en el primer ejemplo.