Экземпляр объекта PHP класса [DateTime ('@ - 1')] как константа в другом классе

Я определяю класс, одним из свойств которого является объект DateTime. Я хочу установить его значение по умолчанию на временную метку unix «-1». Я также хочу, чтобы это значение по умолчанию было постоянным, чтобы все объекты знали его значение.

Но я не хочу объявлять что-то вроде const PROPERTY_DEFAULT_DATE = '-1';, поскольку свойство будет объектом DateTime и операциями / функциями, использующими это значение по умолчанию, и свойство будет трудно обрабатывать, если PROPERTY_DEFAULT_DATE не является правильным объектом DateTime.

Итак, могу ли я сделать конкретный экземпляр объекта класса константой внутри другого класса?


В руководстве по PHP сказано

Значение должно быть константным выражением, а не (например) переменной, свойством, результатом математической операции или вызовом функции.

Не упоминает об этом, но я думаю, что это невозможно (пробовал много вариантов, всегда были синтаксические ошибки)
Если это невозможно, какие у меня есть альтернативы?


Изменить: я думаю, мне нужно найти решение проблемы определения "значения по умолчанию" для моего свойства, которое в данном случае является объектом DateTime.
Какое значение по умолчанию будет вам установлен в __construct()? (нет, пожалуйста, не NULL, я ожидаю, что должно существовать что-то более элегантное решение) Также имейте в виду, что оно может использоваться в операциях / функциях внутри класса / подкласса
Обновление: я последовал совету здесь и создал свойство private $_DEFAULT_DATE и получатель для этого. Для этого свойства нет установщика, поэтому я могу быть уверен, что оно не будет изменено. (Конечно, я стараюсь не изменять его в реализации класса)


person Sudhi    schedule 06.09.2011    source источник
comment
в сторону, но используете ли вы класс PHP DateTime или пишете свой собственный? Я почти уверен (но могу ошибаться), что DateTime не позволит вам установить unix timestamp = -1.   -  person dnagirl    schedule 06.09.2011
comment
возможно вы ошибаетесь, попробуйте $nullDate = new DateTime('@-1'); или я подавляю предупреждения / ошибки с помощью @?   -  person Sudhi    schedule 06.09.2011
comment
вы подавляете ошибку, чего на самом деле делать не нужно, поскольку DateTime делает это автоматически. Я проверил свои предположения, и я прав: -1 - недопустимое значение. Попробуйте следующее: $d=new DateTime();//now $u=new DateTime('-1');//ignores the illegal value and returns new DateTime(), ie now $u1=date_create('-1');//ignores the illegal value and returns new DateTime(), ie now $u2=date_create_from_format('U',0);//time=0 $u3=date_create_from_format('U',-1); //returns false   -  person dnagirl    schedule 06.09.2011
comment
Я использую PHP5.3, и у меня нет ошибок, и я получаю временную метку -1, то есть (эпоха unix - 1 секунда). Даже если я оставлю @, я получу те же результаты. Более того, @ находится внутри кавычек, то есть является частью строкового аргумента, переданного DateTime. Я думаю, что DateTime принимает аргумент, начинающийся с @, как временную метку unix (поскольку он выдает ошибку, если вы передаете целые числа, попробуйте new DateTime(32) или new DateTime('32')), но если вы добавите его с помощью @, аргумент теперь является строкой, но DateTime создает объект с dateTime = timestamp значение после @   -  person Sudhi    schedule 06.09.2011


Ответы (4)


Что ж, к сожалению, инструкция верна. Вы не можете поместить объект в константу. Вы можете сделать это свойством, или, в вашем случае, может подойти статическая функция;

YourClass::getDefaultDate(); // return DateTime('-1');
person Rijk    schedule 06.09.2011

Это невозможно. Самая простая альтернатива - использовать статическое свойство, но похоже, что вы хотите, чтобы это свойство не изменилось.

Поэтому в этом случае единственный логический способ сделать это - сделать статическое свойство закрытым и добавить статическую функцию, возвращающую объект DateTime.

Однако я все еще не думаю, что вы хотите использовать единичный объект. Если какой-либо другой метод запрашивает этот объект по умолчанию, они смогут его изменить, и вы можете получить странные результаты. Любой запрос к этому методу (на мой взгляд) должен получить новый или клонированный объект DateTime.

person Evert    schedule 06.09.2011
comment
хм, если бы вы использовали объект DateTime в качестве свойства, какое значение вы установили бы для него в __construct()? - person Sudhi; 06.09.2011
comment
@Sudhi: Класс PHP DateTime по умолчанию находится в стадии разработки. - person dnagirl; 06.09.2011
comment
Да, я знаю. Но вы бы предпочли установить его как now () или что-то еще? DateTime ('0000-00-00 00:00:00') дает странный результат, и попытка DateTime ('@ - 1') в этом случае не работает. Интересно, это больше проблема конвенции, чем проблема стандартизации - person Sudhi; 06.09.2011

Руководство правильное: нет, вы не можете использовать объекты в const выражениях в PHP.

Вы должны инициализировать правильный член внутри конструктора, если хотите использовать его таким образом. Если вы хотите, чтобы его нельзя было изменить, вы можете сделать это с определенными усилиями .

person sanmai    schedule 06.09.2011

из php.net о звуковом синтаксисе и использовании Кто-то говорил о " динамические "присваивания константам". Какие? Нет никаких динамических присвоений константам, назначения времени выполнения работают только с переменными. Возьмем предложенный пример:

<?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 
    } 
} 
?> 

Это не константы, это свойства класса. Что-то вроде "this-> time = time ()" даже полностью противоречит назначению константы. Константы должны быть постоянными значениями при каждом выполнении. Они не должны изменяться каждый раз, когда запускается скрипт или создается экземпляр класса.

Вывод: не пытайтесь изобретать константы как переменные. Если константы не работают, просто используйте переменные. Тогда вам не нужно изобретать заново методы, чтобы добиться того, что уже есть.

От себя: вы можете использовать частные статические методы и магические методы __getStatic (поскольку он доступен только из php 5.3) или использовать простые __get и property_exist или использовать Reflection. Но на самом деле я не вижу проблемы, которая требует этого решения. Извиняюсь ((

person ZigZag    schedule 06.09.2011
comment
Я я определяю константу: '-1', но в контексте временной метки unix. Разве это не константа? - person Sudhi; 06.09.2011
comment
если бы это было так, я бы не задавал этот вопрос. Когда я сказал константа, я имел в виду значение свойства / атрибута. Это никогда не изменится. Так же, как буквальное «-1» в качестве int будет таким же (и, следовательно, константой) на любом языке / коде, я хочу, чтобы «-1» было константой: но в контексте временной метки unix (как в 1969-12-31 23 : 59: 59 +00: 00). Я также использую «0» (так что я получаю именно эпоху unix), но дело в том, что это определенная и постоянная отметка на временной шкале. - person Sudhi; 06.09.2011