2010-10-28 30 views
13

Io li uso per implementare factory modello, ad esempio:PHP: perché non posso dichiarare una variabile const statica?

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

E vorrei usarli come:

$x = new Types::car; 

E 'possibile?

E se la mia classe ha parametr in construcor, che non funziona:

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

Intendi dire una costante statica rispetto a una costante dinamica? :) –

+0

Controlla modifica plz;) –

+0

@John Ancora non capisco il tuo esempio. Perché dichiari la stessa costante quattro volte? Quale sarebbe il risultato atteso? La parola chiave 'const' dovrebbe funzionare, basta lasciare il' static'. Non ha senso per una costante. –

risposta

21

Il codice dovrebbe essere:

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

Nota che le costanti sono legati alla definizione di classe, sono statici per definizione.

Da Documenti:

Dal PHP 5.3.0, è possibile riferimento alla classe utilizzando una variabile. Il valore della variabile non può essere una parola chiave (ad esempio self, parent e statica).

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

Ulteriori informazioni:

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

+0

OOO, esattamente! Che mi piacerebbe ottenere! Ma cosa succede se la mia classe ha smth in construcotr? Non posso farlo come: '$ x = new Types :: car (123);' ...:( –

+3

@John: Istanziare una classe variabile assegnando prima il valore costante a una variabile: '$ tipo = Tipi :: auto; $ x = nuovo $ tipo (123);' – BoltClock

+0

L'unica cosa che aggiungerei è la denominazione la convenzione per le costanti è tutto maiuscolo – Ice76

1

E 'una costante. Non puoi cambiarlo Quindi non ha alcun senso che tu abbia un membro costante non statico. Quindi non devi dichiararli come variabili statiche o di classe.

4

Le costanti sono già statiche nel senso che non sono legate a un'istanza della classe. Ecco come definirli e utilizzarli come preferisci:

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

$x = Types::car; 
+0

Vuoi dire 'Tipi :: auto'. A parte questo, +1 –

Problemi correlati