2010-11-28 47 views
8

Voici le code qui ne fonctionnera pas:Comment utiliser une constante de classe dans un attribut de classe en PHP?

class MyClass 
{ 
    const myconst = 'somevalue'; 

    private $myvar = array(0 => 'do something with '.self::myconst); 
} 

Il semble que les constantes de classe ne sont pas disponibles « compilation », mais seulement lors de l'exécution. Est-ce que quelqu'un sait une solution de contournement? (Définir ne fonctionnera pas)

Merci

+0

Si vous cherchez quelque chose comme une macro C, PHP ne fonctionne pas de cette façon. d'ailleurs, il n'y a pas de "temps de compilation". PHP est un interprète. – stillstanding

+0

Les personnes qui ont écrit le manuel semblent avoir l'impression qu'il y a un "temps de compilation". http://www.php.net/manual/en/language.oop5.properties.php –

+0

Il y a un "temps de compilation" (sorte de), puisque les internes de PHP convertissent le code texte en bytecode. Voir http://sebastian-bergmann.de/archives/868-PHP-Compiler-Internals.html – Antoine

Répondre

10

Le problème dans votre déclaration de classe ne sont pas que vous utilisez une constante, mais que vous utilisez une expression.

Les variables de membre de classe sont appelées "propriétés". (...) Ils sont définis en utilisant l'un des mots-clés public, protected ou private, suivi d'une déclaration de variable normale. Cette déclaration peut inclure une initialisation, mais cette initialisation doit être une valeur constante - c'est-à-dire qu'elle doit pouvoir être évaluée au moment de la compilation et ne doit pas dépendre des informations d'exécution pour être évaluée.

Cette déclaration simple, par exemple, ne compilera pas (erreur d'analyse):

class MyClass{ 
    private $myvar = 3+2; 
} 

Mais si nous modifions votre déclaration de classe à utiliser la constante simple, plutôt que d'une chaîne concaténée avec cette constante, il sera fonctionne comme prévu.

class MyClass{ 
    const myconst = 'somevalue'; 
    public $myvar = array(0 => self::myconst); 
} 

$obj = new MyClass(); 
echo $obj->myvar[0]; 

En tant que travail autour de vous pouvez initialiser vos propriétés dans le constructeur:

class MyClass{ 
    const myconst = 'somevalue'; 
    public $myvar; 

    public function __construct(){ 
     $this->myvar = array(0 => 'do something with '.self::myconst); 
    } 
} 
$obj = new MyClass(); 
echo $obj->myvar[0]; 

J'espère que cela vous aide,
Alin

+0

Oui, je le savais ... J'ai d'abord essayé de "const" mon tableau, mais PHP ne le permet pas. Et il semble que la base "define" (le vrai, le #define de C/C++) n'existe pas en PHP. Donc, quelqu'un a une solution de contournement? – Antoine

+0

@Antoine Voir la dernière modification. C'est tout ce que je pouvais penser et je dirais que c'est une méthode acceptable pour initialiser dans le constructeur. –

+0

Merci, c'est un bon moyen de résoudre mon problème! – Antoine

0

Notez que pour PHP 5.6 et au-dessus , c'est possible de le faire.

Voir https://secure.php.net/manual/en/migration56.new-features.php:

Il est maintenant possible de fournir une expression scalaire contenant des littéraux numériques et de chaîne et/ou des constantes dans des contextes où PHP prévu auparavant une valeur statique, comme les déclarations constantes et propriétés et fonction par défaut arguments.