2011-03-22 17 views
6

que tienen una clase con el siguiente esquema¿Establecer constantes de clase después del constructor?

class MyClass 
{ 
    const x = 'abc'; 
    const y = '123'; 

    function _contruct() {} 
} 

¿Hay alguna forma para mí de tener las constantes siguen siendo desarmado en el cuerpo de la clase, y pueden ajustar dinámicamente después de que el constructor ha sido llamado? Por ejemplo algo como esto:

class MyClass 
{ 
    const x; 
    const y; 

    function _contruct() 
    { 
     $this->setStuff(); 
    } 

    function setStuff() 
    { 
    $this->x = Config::getX(); 
    $this->y = Config::getY(); 
    } 
} 
+1

Simplemente curioso, ¿qué estás tratando de lograr aquí? –

+0

@Marcar las clases ahora mismo requiere que algunos valores de configuración estén codificados en el cuerpo de la clase, estoy tratando de cambiarlo para que sean extraídos de la clase config más adelante en la clase –

+1

Parece inútil convertirlos en constantes. –

Respuesta

6

Como el nombre sugiere, este valor no se puede cambiar durante la ejecución de la secuencia de comandos (a excepción de constantes mágicas, que son en realidad no constantes) (http://php.net/manual/en/language.constants.php)

así, no. Podrías convertirlos en vars privados.

4

constantes Nº de clase (y constantes globales o de espacios de nombres definidos con la palabra clave const) tiene por qué ser valores literales y debe establecerse antes de tiempo de ejecución. Ahí es donde se diferencian de los de la vieja escuela define() constantes que se establecen en tiempo de ejecución. No es posible cambiar o establecer una constante const durante la ejecución de una secuencia de comandos.

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

del manual de PHP: Class Constants

Así que eso es posible:

define('MY_CONST', someFunctionThatReturnsAValue()); 

Pero eso no es:

const MY_CONST = someFunctionThatReturnsAValue(); 

// or 

class MyClass { 
    const MY_CONST = = someFunctionThatReturnsAValue(); 
} 

// or 

namespace MyNamespace; 
const MY_CONST = someFunctionThatReturnsAValue(); 

Y mediante el uso $this en su ejemplo se podría suponer que intente establecer las constantes en el nivel de instancia, pero las constantes de clase a re siempre está estáticamente definido en el nivel de clase.

+0

El problema con las antiguas declaraciones de definición de skool es que no están limitadas en su alcance. Sería útil si tomaran una señal de C++ y permitieran que las constantes se asignaran en el tiempo de ejecución. De esta forma, si queremos guardar algunos datos para una verificación posterior (como un ID de usuario), aún podemos declararlos en tiempo de ejecución (por ejemplo, desde una variable $ _SESSION), restringirlos a una clase y hacerlos inmutables. Muy buena explicación, sin embargo. ¡Gracias chicos! – Atomox

1

Constantes es "constante". No puedes cambiarlo

Puede utilizar variables para esto.

1

imposible. Si pudieras configurar xey en setStuff(), también podrías (re) establecerlos en cualquier otro método. Por definición, una constante no puede cambiar. Por lo tanto, tu x y y serían variables, no constantes.

3

No, las constantes son constantes, ya que se supone que es constante. Declararlos primero con valores vacíos y cambiar esos valores con otra cosa significa que son variables. Dado que su objetivo parece ser establecerlos una vez, pero nunca para siempre, considere la inyección de Constructor, p.

class MyClass 
{ 
    private $x; 
    private $y; 
    public function __construct($x, $y) 
    { 
     $this->x = $x; 
     $this->y = $y; 
    } 
} 

Mientras su doesnt clase exponer cualquier método para modificar $x y $y y no estás chaning internamente, que son efectivamente constante.Lo único que no puede hacer con las variables no públicas es MyClass::X, pero opino que no debe usar las constantes de clase fuera de sus respectivas clases de todos modos porque introduce el acoplamiento entre el consumidor y la clase.

Simple como eso.

Cuestiones relacionadas