Pregunta

Estoy definiendo una clase que tiene un objeto de fecha y hora como una de las propiedades. Quiero establecer su valor predeterminado en UNIX TimeStamp de '-1'. También quiero que este valor predeterminado sea constante para que todos los objetos sepan su valor.

Pero no quiero declarar algo como const PROPERTY_DEFAULT_DATE = '-1'; Como la propiedad será un objeto de fecha y hora y las operaciones/funciones utilizando este valor predeterminado y la propiedad será difícil de manejar si Property_Default_Date no es un objeto de fecha y hora adecuado

Entonces, ¿puedo tener una instancia de objeto particular de una clase como constante dentro de otra clase?


El manual de PHP dice

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

No menciona esto, pero creo que no se puede hacer (probado muchas variaciones, siempre recibí errores de sintaxis)
Si no es posible, ¿qué alternativas tengo?


Editar: Creo que necesito encontrar la solución al problema de definir un "valor predeterminado" en mi propiedad, que en este caso es un objeto de fecha y hora.
¿Qué valor predeterminado será establecido en el __construct()? (No, no nulo, por favor, espero que exista algo más elegante) Tenga en cuenta que puede usarse en operaciones/funciones dentro de la clase/subclase
Actualización: seguí el consejo aquí y creé un private $_DEFAULT_DATE propiedad y un recibo para ello. No hay setter para esta propiedad, por lo que puedo estar seguro de que no se cambiará. (Por supuesto, tengo cuidado de no cambiarlo dentro de la implementación de la clase)

¿Fue útil?

Solución

Bueno, desafortunadamente, el manual es correcto. No puedes poner un objeto en una constante. Puede convertirlo en una propiedad, o en su caso una función estática podría ser adecuada;

YourClass::getDefaultDate(); // return DateTime('-1');

Otros consejos

No es posible. La alternativa más simple es usar una propiedad estática, pero parece que desea asegurarse de que esta propiedad no cambie.

Entonces, en ese caso, la única forma lógica de hacer esto es hacer que la propiedad estática sea privada y agregar una función estática que devuelva el objeto DateTime.

Sin embargo, todavía no creo que quieras usar un objeto singular. Si algún otro método solicita este objeto predeterminado, podrá modificarlo y podría obtener resultados extraños. Cualquier solicitud a este método (en mi opinión) debe recibir un objeto de fecha y hora nuevo o clonado.

El manual es correcto: no, no puedes usar objetos en const Expresiones en PHP.

Debe inicializar un miembro adecuado dentro de un constructor si desea usarlo de esta manera. Si quieres que sea inalterable, Con cierto esfuerzo puedes hacerlo así.

de php.net sobre la sintaxis de Sonstant y usarAlguien habló sobre las tareas "dinámicas" a las constantes. ¿Qué? No hay tareas dinámicas para constantes, funcionan de las tareas de tiempo de ejecución solamente con variables. Tomemos el ejemplo propuesto:

<?php 
/** 
 * Constants that deal only with the database 
 */ 
class DbConstant extends aClassConstant { 
    protected $host = 'localhost'; 
    protected $user = 'user'; 
    protected $password = 'pass'; 
    protected $database = 'db'; 
    protected $time; 
    function __construct() { 
        $this->time = time() + 1; // dynamic assignment 
    } 
} 
?> 

Esas no son constantes, esas son propiedades de la clase. Algo como "this-> time = time ()" incluso desafiaría totalmente el propósito de una constante. Se supone que las constantes son solo eso, valores constantes, en cada ejecución. Se supone que no deben cambiar cada vez que se ejecuta un script o se instancia una clase.

Conclusión: No intentes reinventar constantes como variables. Si las constantes no funcionan, solo use variables. Entonces no necesita reinventar métodos para lograr cosas para lo que ya está ahí.

Desde uno mismo: puede usar métodos estáticos privados y usar métodos mágicos __getStatic (ya que es avaliablr solo de PHP 5.3) o usar __get y Property_exist o use reflexión. Pero en realidad no veo el problema que necesita esta solución. Lo siento ((

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top