2010-10-28 4 views
13

Je les utiliser pour mettre en œuvre factory modèle, par exemple:PHP - pourquoi je ne pouvais pas déclarer statique const variable?

class Types{ 
    static const car = "CarClass"; 
    static const tree = "TreeClass"; 
    static const cat = "CatClass"; 
    static const deathstar = "DeathStarClass"; 
} 

Et je voudrais les utiliser comme:

$x = new Types::car; 

Est-il possible?

Et si ma classe a Parametr dans construcor, cela ne fonctionne pas:

$x = new Types::car(123); 
+3

Vous voulez dire une constante statique par rapport à une constante dynamique? :) –

+0

Vérifiez edit plz;) –

+0

@John Je ne comprends toujours pas votre exemple. Pourquoi déclarez-vous la même constante quatre fois? Quel serait le résultat attendu? Le mot-clé 'const' en tant que tel devrait fonctionner, laissez simplement le' static'. Cela n'a pas de sens pour une constante. –

Répondre

21

Votre code doit être:

class Types{ 
    const car = "CarClass"; 
    const tree = "TreeClass"; 
    const cat = "CatClass"; 
    const deathstar = "DeathStarClass"; 
} 

Notez que puisque les constantes sont liées à la définition de classe, ils sont statiques par définition.

De Docs:

PHP 5.3.0, il est possible de référence la classe en utilisant une variable. La valeur de la variable ne peut pas être un mot-clé (par exemple auto, parent et statique).

http://www.php.net/manual/en/language.oop5.static.php

Plus d'info:

http://php.net/manual/en/language.oop5.constants.php

+0

OOO, exacly! Que je voudrais réaliser! Mais que se passe-t-il si ma classe a eu un coup dans la construction? Je ne peux pas le faire comme: '$ x = new Types :: car (123);' ...:( –

+3

@John: instancie une classe de variables en affectant d'abord la valeur de constante à une variable: '$ type = Types :: car; $ x = nouveau $ type (123);' – BoltClock

+0

La seule chose que j'ajouterais c'est de nommer convention pour les constantes est tout en majuscules – Ice76

1

Il est une constante. Vous ne pouvez pas le changer. Cela n'a donc aucun sens que vous ayez un membre constant non statique. Vous n'avez donc pas besoin de les déclarer comme des variables statiques ou de classe.

4

Les constantes sont déjà statiques dans le sens où elles ne sont pas liées à une instance de la classe. Voici comment les définir et les utiliser comme vous le souhaitez:

class Types{ 
    const car = "CarClass"; 
    const tree = "TreeClass"; 
    const cat = "CatClass"; 
    const deathstar = "DeathStarClass"; 
} 

$x = Types::car; 
+0

Vous voulez dire 'Types :: car'. –