2010-02-24 5 views
7

Je voudrais définir une constante de classe en utilisant une concaténation d'une constante existante et d'une chaîne. Je ne peux pas le prédéfinir car seuls les scalaires sont autorisés pour les constantes de prédéfinis, donc je l'ai actuellement dans le cadre de mon constructeur avec une fonction defined() vérifiant si elle est déjà définie. Cette solution fonctionne mais ma constante est maintenant inutilement globale.Définition de la constante de classe dans PHP

Existe-t-il un moyen de définir une constante de classe à l'exécution en PHP?

Merci.

Répondre

9

Voir la PHP manual on Class constants

La valeur doit être une expression constante, et non (par exemple) une variable, une propriété, un résultat d'une opération mathématique ou un appel de fonction.

En d'autres termes, ce n'est pas possible. Vous pouvez le faire avec runkit_constant_add mais ce type de patch de singe est fortement déconseillé.

+3

Envisagez d'utiliser une variable statique. http://php.net/manual/fr/language.oop5.static.php – Matchu

+1

utilise define() considéré monkey-patching? existe-t-il une raison pour laquelle la définition de constantes globales à l'exécution est acceptable alors que la définition de constantes de classe ne l'est pas? – joshs

+0

@josh L'utilisation de define() * en tant que tel * n'est pas considérée comme un patch de singe. Vous devez avoir un mécanisme pour définir les constantes et techniquement cela arrive toujours à l'exécution. Cependant, l'idée d'une telle constante est de fournir une * valeur * globalement * disponible *, ce qui explique pourquoi vous déclarez généralement des constantes au-dessus de votre script. Le faire plus tard ou sur la base de certaines conditions est ce que je considérerais comme une mauvaise utilisation car alors vous utilisez la constante comme une variable et en cas de redéfinition ou de redéfinition, je considère cela comme un mauvais monkeypatching, car cela modifie le comportement interne de PHP. – Gordon

3

Une autre option consiste à utiliser les méthodes magiques __get() et __set() pour rejeter les modifications de certaines variables. Ce n'est pas tant une constante qu'une variable en lecture seule (du point de vue des autres classes). Quelque chose comme ceci:

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

Vous ne pouvez pas faire exactement ce que vous voulez faire, par Gordon's answer. Cependant, vous pouvez faire quelque chose comme ça. Vous ne pouvez le définir qu'une seule fois:

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; 
    } 
} 
Questions connexes