2010-02-24 19 views
7

Me gustaría definir una constante de clase utilizando una concatenación de una constante existente y una cadena. No puedo predefinirlo porque solo se permiten escalas para predefinir constantes, por lo que actualmente lo tengo como parte de mi constructor con una función definida() comprobando si ya está definido. Esta solución funciona pero mi constante ahora es innecesariamente global.Definición de constante de clase en PHP

¿Hay alguna manera de definir una constante de clase en tiempo de ejecución en php?

Gracias.

Respuesta

9

Véase el PHP manual on Class constants

El valor debe ser una expresión constante, no (por ejemplo) una variable, una propiedad, resultado de una operación matemática, o una llamada a la función.

En otras palabras, no es posible. Puede hacerlo con runkit_constant_add, pero este tipo de parche de monos se desaconseja enérgicamente.

+3

Considere el uso de una variable estática. http://php.net/manual/en/language.oop5.static.php – Matchu

+1

está utilizando define() considerado monkey-patching? ¿Hay alguna razón por la cual la definición de constantes globales en el tiempo de ejecución es aceptable, mientras que la definición de las constantes de clase no lo es? – joshs

+0

@josh El uso de define() * como tal * no se considera parche de monos. Tienes que tener un mecanismo para definir las constantes y técnicamente esto siempre sucede en el tiempo de ejecución. Sin embargo, la idea de tal constante es proporcionar un * valor * disponible *, * fijo *, que es la razón por la que generalmente declaras constantes en la parte superior de la secuencia de comandos. Hacerlo más tarde o en función de algunas condiciones es lo que consideraría un uso incorrecto porque entonces estás usando la constante como una variable y, en caso de redefinirlas o eliminarlas, consideraría que mal parchear, porque cambia el comportamiento interno de PHP. – Gordon

3

Otra opción es usar los métodos mágicos __get() y __set() para rechazar los cambios en ciertas variables. Esto no es tanto una constante como una variable de solo lectura (desde la perspectiva de otras clases). Algo como esto:

// Completely untested, just an idea 
// inspired in part from the Zend_Config class in Zend Framework 
class Foobar { 

    private $myconstant; 

    public function __construct($val) { 
     $this->myconstant = $val; 
    } 

    public function __get($name) { 
     // this will expose any private variables 
     // you may want to only allow certain ones to be exposed 
     return $this->$name; 
    } 

    public function __set($name) { 
     throw new Excpetion("Can't set read-only property"); 
    } 
} 
3

No se puede hacer exactamente lo que quiere hacer, por Gordon's answer. Sin embargo, puedes hacer algo como esto. Solo puede configurarlo una vez:

class MyClass 
{ 
    private static $myFakeConst; 

    public getMyFakeConst() 
    { 
     return self::$myFakeConst; 
    } 

    public setMyFakeConst($val) 
    { 
     if (!is_null(self::$myFakeConst)) 
      throw new Exception('Cannot change the value of myFakeConst.'); 

     self::$myFakeConst = $val; 
    } 
} 
Cuestiones relacionadas