PHP 5.3: Late estática vinculante no funciona para propiedades cuando se define en la clase padre, mientras que faltan en la clase del niño

StackOverflow https://stackoverflow.com/questions/4577187

Pregunta

Tome un vistazo a este ejemplo, y observe las salidas indicadas.

<?php

class Mommy
{
    protected static $_data = "Mommy Data";

    public static function init( $data )
    {
        static::$_data = $data;
    }

    public static function showData()
    {
        echo static::$_data . "<br>";
    }
}

class Brother extends Mommy
{
}

class Sister extends Mommy
{
}

Brother::init( "Brother Data" );
Sister::init( "Sister Data" );

Brother::showData(); // Outputs: Sister Data
Sister::showData(); // Outputs: Sister Data

?>

Mi entendimiento es que el uso de la etiqueta estática de palabras clave se referirían a la clase hija, pero parece ser que mágicamente se aplica a la clase padre siempre y cuando no se encuentra en la clase hija. (Este es un tipo de comportamiento peligroso para PHP, más en que se explica más adelante.)

Tengo las siguientes dos cosas en mente para qué quiero hacer esto:

  1. No quiero que la redundancia de definir todas las propiedades en todas las clases hijas.
  2. Quiero propiedades que se definen como valores por defecto en la clase padre y quiero que la definición de clase niño sea capaz de anular estas propiedades siempre que sea necesario. Las necesidades de la clase infantil para excluir propiedades siempre que los valores por defecto se pretende, que es por lo que no definen las propiedades en las clases hijas en el ejemplo anterior.

Sin embargo, si estamos queriendo sustituir una propiedad en tiempo de ejecución (a través del método init), se anulará por la clase padre! A partir de ese punto en adelante, las clases hijas inicializan antes (como en el caso del hermano) inesperadamente cambiar en ti.

Al parecer, este es el resultado de las clases hijas no tener su propia copia de la propiedad estática cuando no se define explícitamente en el interior de la clase hija - pero en vez de tirar un error que cambia el comportamiento de estática para acceder a los padres. Por lo tanto, ¿hay alguna manera de que la clase padre puede crear dinámicamente una propiedad que pertenece a la clase de niño sin que aparezcan dentro de la definición de clase de niños? De esta manera la clase niño podría tener su propia copia de la propiedad estática y la palabra clave static pueden referirse a ella correctamente, y puede ser escrita para tener en cuenta los valores predeterminados de propiedad de los padres.

O hay alguna otra solución, bueno, malo, o feo?

¿Fue útil?

Solución

Se hace referencia a la clase correcta, es sólo que, a menos que se redeclara o de lo contrario el conjunto de referencia se rompe, propiedades estáticas en las subclases están en el mismo conjunto de referencia como en la superclase.

Por lo que debe hacer:

class Brother extends Mommy
{
    protected static $_data;
}

o

class Brother extends Mommy
{
}

$tmp = null;
Brother::$_data =& $tmp;
unset($tmp);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top