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