2010-11-28 16 views
8

Aquí está el código que no funciona:¿Cómo usar una constante de clase en un atributo de clase en PHP?

class MyClass 
{ 
    const myconst = 'somevalue'; 

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

Parece que las constantes de clase no están disponibles en "tiempo de compilación", pero sólo en tiempo de ejecución. ¿Alguien sabe alguna solución? (Definir no funcionará)

Gracias

+0

si está buscando algo así como una macro C, PHP no funciona de esa manera. además, no hay "tiempo de compilación". PHP es un intérprete. – stillstanding

+0

Las personas que escribieron el manual parecen tener la impresión de que hay un "tiempo de compilación". http://www.php.net/manual/en/language.oop5.properties.php –

+0

Hay un "tiempo de compilación" (más o menos), ya que los internos de PHP convierten el código de texto a bytecode. Ver http://sebastian-bergmann.de/archives/868-PHP-Compiler-Internals.html – Antoine

Respuesta

10

El problema en su declaración de la clase no es que está utilizando una constante, sino que está utilizando una expresión.

Las variables de miembro de clase se denominan "propiedades". (...) Se definen utilizando una de las palabras clave public, protected o private, seguida de una declaración de variable normal. Esta declaración puede incluir una inicialización, , pero esta inicialización debe ser un valor constante, es decir, debe poder evaluarse en tiempo de compilación y no debe depender de la información del tiempo de ejecución para poder ser evaluada.

Esta simple declaración, por ejemplo, no se compilará (error de análisis):

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

Pero si alteramos su declaración de la clase a utilizar la constante simple, en lugar de una cadena concatenada con esa constante que lo hará trabajar como se espera

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

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

Como solución alternativa se podría inicializar las propiedades en el constructor:

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]; 

espero que esto le ayuda,
Alin

+0

Sí, sabía que ... primero traté de "const" mi matriz, pero PHP no lo permite. Y parece que el "definir" básico (el real, el #define de C/C++) no existe en PHP. Entonces, ¿alguien tiene una solución alternativa? – Antoine

+0

@Antoine Consulte la última edición. Esto es todo lo que pude pensar y diría que es un método aceptable para inicializar en el constructor. –

+0

¡Gracias, esa es una buena manera de resolver mi problema! – Antoine

0

Tenga en cuenta que para PHP 5.6 y por encima de , es posible hacerlo.

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

Ahora es posible proporcionar una expresión escalar relacionadas con literales y/o constantes numéricas y de cadena en contextos donde PHP se esperaba un valor estático, tales como declaraciones de constantes y de propiedad y función por defecto argumentos.

Cuestiones relacionadas