¿Qué son exactamente los enlaces estáticos tardíos en PHP?
fuente
¿Qué son exactamente los enlaces estáticos tardíos en PHP?
Definitivamente necesita leer Enlaces estáticos tardíos en el manual de PHP. Sin embargo, intentaré darle un resumen rápido.
Básicamente, se reduce al hecho de que la self
palabra clave no sigue las mismas reglas de herencia. self
siempre se resuelve en la clase en la que se usa. Esto significa que si crea un método en una clase primaria y lo llama desde una clase secundaria, self
no hará referencia al secundario como podría esperar.
El enlace estático tardío introduce un nuevo uso para la static
palabra clave, que aborda esta deficiencia en particular. Cuando lo usa static
, representa la clase donde lo usa por primera vez, es decir. se 'une' a la clase de tiempo de ejecución.
Esos son los dos conceptos básicos detrás de esto. La forma self
, parent
y static
funciona cuando static
está en juego puede ser sutil, por lo que en lugar de ir a más detalle, lo recomiendo encarecidamente que estudie los ejemplos de páginas del manual. Una vez que comprenda los conceptos básicos de cada palabra clave, los ejemplos son bastante necesarios para ver qué tipo de resultados obtendrá.
self
palabra clave no sigue las reglas de herencia.self
siempre se resuelve en la clase en la que se usa". - Lo que no significa que no pueda llamar al método estático de un padre desde un objeto hijo a través deself
, al igual que con los métodos no estáticos. Quizás quieras decir lo correcto, pero deberías reformular eso. Todo realmente importa una vez que los niños hayan nombrado miembros idénticos, ya que puede decidir a qué referirse utilizando en sustatic::
lugar.Desde PHP: Enlaces estáticos tardíos - Manual :
Veamos un ejemplo:
fuente
No hay un comportamiento muy obvio:
El siguiente código produce 'alphabeta'.
Sin embargo, si eliminamos la declaración de la función classname de la clase beta, obtenemos 'alphaalpha' como resultado.
fuente
Cito del libro: "PHP Master escribe código de vanguardia".
Siéntase libre de echar un vistazo a la documentación oficial de php también: http://php.net/manual/en/language.oop5.late-static-bindings.php
La forma más clara de explicar el enlace estático tardío es con un ejemplo simple. Eche un vistazo a las dos definiciones de clase a continuación y siga leyendo.
Vemos una clase para padres (vehículo) y una clase para niños (automóvil). La clase para padres tiene 2 métodos públicos:
invokeDriveByStatic
invokeStopBySelf
La clase para padres también tiene 2 métodos privados:
drive
stop
La clase infantil anula 2 métodos:
drive
stop
Ahora invoquemos los métodos públicos:
invokeDriveByStatic
invokeStopBySelf
Pregúntese: ¿Qué clase invoca
invokeDriveByStatic
/invokeStopBySelf
? ¿La clase padre o hijo?Echa un vistazo a continuación:
La
static
palabra clave se utiliza en un patrón de diseño Singleton. Ver enlace: https://refactoring.guru/design-patterns/singleton/php/examplefuente
El ejemplo más simple para mostrar la diferencia.
Nota, self :: $ c
Enlace estático tardío, nota estática :: $ c
fuente
Por ejemplo:
fuente
Mirándolo desde un "¿por qué usaría esto?" perspectiva, es básicamente una forma de cambiar el contexto desde el cual se está interpretando / ejecutando el método estático.
Con
self
, el contexto es el que definió el método originalmente. Constatic
, es desde el que lo estás llamando.fuente
Además, observe si actualiza las variables estáticas en las clases secundarias. Encontré este resultado (algo) inesperado donde el niño B actualiza al niño C:
Puede solucionarlo declarando la misma variable en cada clase secundaria, por ejemplo:
fuente