2010-01-23 15 views
6

Tengo una función estática en una clase que necesita ser llamada desde varias clases secundarias. Necesito una constante de la clase secundaria que llama para estar disponible en esa función. Para tener estas constantes disponibles en otros lugares, las clases secundarias tienen una función que devuelve el valor de esa constante (php 5.2.9).Constante de hijo llamado no está disponible en la función estática en el padre

Sin embargo, cuando estoy en la clase principal, parece que no puedo acceder a esa constante, ni con la función ni directamente. ¿Es eso posible en php 5.2.9 o necesito pasarlo como argumento?

Ésta es una versión simple del código:

abstract class ParentClass { 
    static function DoSomething() { 
     $not_working = self::show_const(); 
     $not_working_either = self::SOME_CONST; 

     return 'working'; 
    } 
} 

class ChildClass extends ParentClass { 
    const SOME_CONST = 'some string'; 

    function show_const() { 
     return self::SOME_CONST; 
    } 
} 

$result = ChildClass::DoSomething(); 

Editar: el error generado es:

  • La llamada al método definido ParentClass :: show_const() (por función)
  • Constante de clase no definida 'SOME_CONST' (utilizando self :: SOME_CONST)
+0

Cuál es el mensaje de error que se está generando? –

Respuesta

13

Desafortunadamente, lo que estás tratando de hacer no va a funcionar antes del 5.3. El problema aquí es early enlace estático versus tarde enlace estático. La palabra clave self se enlaza temprano, por lo que solo se ve en la clase donde se usa para resolver los símbolos. La constante mágica __CLASS__ o la función get_class() tampoco funcionarán, estas también hacen enlaces estáticos anticipados. Por este motivo, PHP 5.3 extendió la palabra clave static para indicar el enlace tardío cuando se usa como static::some_method().

Así que en 5.3 Esto funcionaría:

abstract class ParentClass { 
    public static function DoSomething() { 
    return static::show_const(); 
    // also, you could just do 
    //return static::SOME_CONST; 
    } 
} 

class ChildClass extends ParentClass { 
    const SOME_CONST = 'some string'; 
    public static function show_const() { 
    return self::SOME_CONST; 
    } 
} 

$result = ChildClass::DoSomething(); 
+0

Gracias, tenía miedo de eso. Por cierto, la única razón por la que estoy usando una función para devolver la constante es que parece ser la única forma de tenerla disponible en objetos en php <5.3 ... – jeroen

+0

+1 - La sintaxis static :: methodName() es nuevo para mí :-) –

+0

+1 La falta de LSB realmente puede hacer que el desarrollo de código OO en PHP (pre 5.3) sea un problema. – nategood

2

Necesitas hacer ChildClass extender clase padre ::

class ChildClass extends ParentClass { 

Editar:

Usted está tratando de hacer referencia a una constante y método en la clase niño de la clase padre que no lo hace saber que la constante de la clase infantil existe. Es un problema de alcance. El niño puede referirse a los métodos y constantes de los padres, pero no a la inversa.

+0

Eso es un error de mi parte en el ejemplo, he corregido la pregunta. – jeroen

+0

+1 Expresado sucintamente. –

+0

Obviamente tienes razón, ya que no funciona, pero en realidad estoy llamando a la clase secundaria, no a la clase principal (aunque la función reside en la clase principal ...), por lo que me parece lógico que sus propiedades estaría disponible. ¡Gracias de cualquier manera! – jeroen

Cuestiones relacionadas