2010-07-03 14 views
12
<?php 
class Base { 
    protected static $c = 'base'; 

    public static function getC() { 
    return self::$c; 
    } 
} 

class Derived extends Base { 
    protected static $c = 'derived'; 
} 

echo Base::getC(); // output "base" 
echo Derived::getC(); // output "base", but I need "derived" here! 
?> 

¿Cuál es la mejor solución?Anulando miembros estáticos en clases derivadas en PHP

+7

reemplazar self :: $ C con estática :: $ c – Artefacto

+0

@Artefacto Gracias, que trabaja muy bien! –

Respuesta

9

La mejor manera de resolver esto es actualizar a PHP 5.3, donde late static bindings están disponibles. Si esa no es una opción, desafortunadamente tendrás que rediseñar tu clase.

+0

¿Es PHP 5.3 compatible con PHP 5.2? Mi servidor aún se está ejecutando en 5.2 – powerboy

+3

@powerboy Es compatible ** hacia atrás **, lo que significa que las secuencias de comandos escritas para 5.2 se ejecutarán en 5.3, para la parte más grande. Algunas cosas menores pueden haber cambiado. Vea aquí: http://www.php.net/manual/en/migration53.php – deceze

0

Tienes que volver a implementar el método de la clase base; tratar con:

class Derived extends Base { 
    protected static $c = 'derived'; 

    public static function getC() { 
    return self::$c; 
    } 
} 

Como se ve, esta solución es muy inútil, porque la fuerza de volver a escribir todos los métodos de subclase.

El valor de self::$c depende sólo de la clase en la que en realidad se puso en práctica el método, no es la clase de la cual se llamaba.

3

Basado en la entrada de deceze y Undolog: Undolog es correcto, para PHP < = 5.2.

Pero con 5.3 y finales de fijaciones estáticas que va a funcionar, sólo tiene que utilizar estática en lugar de uno mismo dentro de la función - ahora que va a funcionar ... // THX @ deceze por la pista

para nosotros copiamos pasada de barrido de la muestra usuarios stackoverflow - esto va a funcionar:

class Base { 
    protected static $c = 'base'; 
    public static function getC() { 
    return static::$c; // !! please notice the STATIC instead of SELF !! 
    } 
} 

class Derived extends Base { 
    protected static $c = 'derived'; 
} 

echo Base::getC();  // output "base" 
echo Derived::getC(); // output "derived" 
Cuestiones relacionadas