2010-05-07 13 views
43

sé que puede crear constantes globales en términos de diferencia usando la concatenación de cadenas:¿Puedo usar la concatenación de cadenas para definir una clase CONST en PHP?

define('FOO', 'foo'); 
define('BAR', FOO.'bar'); 
echo BAR; 

imprimirá 'parametro'.

Sin embargo, me sale un error al intentar hacer lo mismo con las constantes de clase.

class foobar { 
    const foo = 'foo'; 
    const foo2 = self::foo; 
    const bar = self::foo.'bar'; 
} 

foo2 se define sin ningún problema, pero declarando barra CONST error cabo

Parse error: syntax error, unexpected '.', expecting ',' or ';'

También he intentado usar funciones como sprintf() pero no le gustan los paréntesis de la izquierda más de lo el concatenador de cuerdas '.'.

Entonces, ¿hay alguna forma de crear constantes de clase en términos de cada una en algo más que un caso de conjunto trivial como foo2?

Respuesta

15

En mi humilde opinión, esta pregunta merece una respuesta para PHP 5.6+, gracias a @jammin comment

A partir de PHP 5.6 le permite definir una de las expresiones escalares estáticas para una constante:

Aunque no es parte de la pregunta, uno debe conocer los límites de la implementación.Lo siguiente no funciona, aunque es contenido estático (pero podría ser manipulada en tiempo de ejecución):

class Foo { 
    public static $bar = "baz"; 
    const HAZ = self::$bar . " boo\n"; 
} 
// PHP Parse error: syntax error, unexpected '$bar' (T_VARIABLE), expecting identifier (T_STRING) or class (T_CLASS) 

class Foo { 
    public static function bar() { return "baz";} 
    const HAZ = self::bar() . " boo\n"; 
} 
// PHP Parse error: syntax error, unexpected '(', expecting ',' or ';' 

Para más información eche un vistazo a: https://wiki.php.net/rfc/const_scalar_exprs y http://php.net/manual/en/language.oop5.constants.php

0

no.

(no creo que hay)

14

siempre caen de nuevo al manual de confianza para cosas como esta.

En cuanto constants:

The value must be a constant expression, not (for example) a variable, a property, a result of a mathematical operation, or a function call.

Así que ... "no" sería la respuesta: D

2

Para clase constantes, no se puede asignar otra cosa que una expresión constante. Citando al PHP manual:

"El valor debe ser una expresión constante, no (por ejemplo) una variable, una propiedad, resultado de una operación matemática, o una llamada a la función"

34

La única manera de hacerlo es() define una expresión y luego usar esa constante en la clase

define('foobar', 'foo' . 'bar'); 

class Foo 
{ 
    const blah = foobar; 
} 

echo Foo::blah; 

Otra opción es ir a bugs.php.net y amablemente pedirles que arreglar esto.

+0

No entiendo la razón de diferente comportamiento del colocador entre constantes globales y constantes de clase. Creo que visitaré bugs.php.net en breve :) Pero a corto plazo, probablemente solo moveré las constantes fuera de la clase y luego las copiaré en la clase. Así que kludgy! – selfsimilar

+8

bug.php.net básicamente me dijo que no lo arreglarían. "Esta es una limitación en la implementación. Para la constante de clase necesitamos un valor constante en tiempo de compilación y no podemos evaluar expresiones. Define() es una función regular, evaluada en tiempo de ejecución y por lo tanto puede contener cualquier valor de cualquier forma cambiando esto significaría agregar una fase de ejecución en el compilador ... " que en realidad es BS, como funciona el siguiente código: define ('BAR', ThisWorks :: foo. 'Bar'); clase ThisWorks { const foo = 'foo'; const bar = BAR; } echo ThisWorks :: bar; esto generará 'foobar' sin ningún error. – selfsimilar

+2

Para cualquier otra persona que lo busque, el error es [# 42355] (https://bugs.php.net/bug.php?id=42355). –

1

Esto puede no ser directamente lo que está buscando, pero me encontré con este hilo, asi que aquí hay una solución que he usado para un problema que estaba teniendo (con sede fuera de la respuesta de @ user187291):

define('app_path', __DIR__ . '/../../'); 
const APPLICATION_PATH = app_path; 
. 
. 
. 
require_once(APPLICATION_PATH . "some_directory/some_file.php"); 
. 
. 
. 

Parece que funciona muy bien!

Cuestiones relacionadas