2010-10-28 12 views
13

usaría para implementar factory patrón, por ejemplo:PHP: ¿por qué no pude declarar la variable const estática?

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

Y me gustaría usarlos como:

$x = new Types::car; 

¿Es posible?

¿Y si mi clase ha parametr en construcor, que no funciona:

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

¿Quiere decir una constante estática en lugar de una constante dinámica? :) –

+0

Compruebe la edición por favor;) –

+0

@John Todavía no entiendo su ejemplo. ¿Por qué declaras la misma constante cuatro veces? ¿Cuál sería el resultado esperado? La palabra clave 'const' como tal debería funcionar, simplemente deje el' static'. No tiene sentido para una constante. –

Respuesta

21

El código debería ser:

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

Tenga en cuenta que dado que las constantes están vinculados a la definición de clase, son estáticos por definición.

De Docs:

A partir de PHP 5.3.0, es posible referencia a la clase utilizando una variable. El valor de la variable no puede ser una palabra clave (por ejemplo, self, parent y estática).

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

Más información:

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

+0

OOO, ¡exactamente! ¡Que me gustaría lograr! Pero, ¿y si mi clase tiene algo en construcotr? No puedo hacerlo como: '$ x = new Types :: car (123);' ...:( –

+3

@John: Crear una instancia de una clase de variable asignando primero el valor constante a una variable: '$ type = Types :: car; $ x = new $ type (123);' – BoltClock

+0

Lo único que agregaría es que los nombres la convención para las constantes está en mayúsculas – Ice76

1

Es una constante. No puedes cambiarlo Entonces no tiene sentido que tengas un miembro constante no estático. Por lo tanto, no tiene que declararlos como variables estáticas o de clase.

4

Las constantes ya son estáticas en el sentido de que no están vinculadas a una instancia de la clase. Aquí se explica cómo definirlos y usarlos como desee:

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

$x = Types::car; 
+0

Te refieres a 'Types :: car'. Aparte de eso, +1 –

Cuestiones relacionadas