2010-02-24 24 views
7

Vorrei definire una costante di classe utilizzando una concatenazione di una costante esistente e una stringa. Non posso predefinirlo perché solo gli scalari sono consentiti per le costanti predefinite, quindi attualmente lo ho come parte del mio costruttore con una funzione defined() che verifica se è già definita. Questa soluzione funziona ma la mia costante è ora inutilmente globale.Definizione della costante di classe in PHP

C'è un modo per definire una costante di classe in fase di esecuzione in php?

Grazie.

risposta

9

Vedere la PHP manual on Class constants

Il valore deve essere un'espressione costante, non (per esempio) una variabile, una proprietà, a seguito di un'operazione matematica, o una chiamata di funzione.

In altre parole, non è possibile. Potresti farlo con runkit_constant_add ma questo tipo di patch per scimmie è fortemente scoraggiato.

+3

Prendere in considerazione l'utilizzo di una variabile statica. http://php.net/manual/en/language.oop5.static.php – Matchu

+1

utilizza define() considerato come patch per le scimmie? c'è un motivo per cui la definizione delle costanti globali in fase di runtime è accettabile mentre la definizione delle costanti di classe non lo è? – joshs

+0

@josh L'utilizzo di define() * come tale * non è considerato patch-patch per scimmia. Devi avere un meccanismo per definire le costanti e tecnicamente ciò accade sempre in fase di esecuzione. Tuttavia, l'idea di una tale costante è quella di fornire un valore * *, * fisso * globalmente disponibile, motivo per cui di solito dichiarate le costanti in cima al vostro script. In questo modo tardive e sulla base di alcune condizioni è quello che vorrei prendere in considerazione l'uso sbagliato, perché poi si utilizza la costante come una variabile e, in caso di o di ridefinire o cancellandoli, mi considero cattiva monkeypatching, perché cambia il comportamento interno di PHP. – Gordon

3

Un'altra opzione consiste nell'utilizzare i metodi magici __get() e __set() per rifiutare le modifiche a determinate variabili. Questa non è tanto una costante quanto una variabile di sola lettura (dal punto di vista di altre classi). Qualcosa di simile a questo:

// 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

Non si può fare esattamente quello che vuoi fare, per Gordon's answer. Tuttavia, puoi fare qualcosa di simile. È possibile impostarlo solo una volta:

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; 
    } 
} 
Problemi correlati