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

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

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

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


Руководство по PHP говорит

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

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


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

4 ответа

Решение

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

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

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

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

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

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

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

С 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. Но на самом деле я не вижу проблемы, для которой нужно это решение. Извини ((

Другие вопросы по тегам