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

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 06 сентября 2011

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

YourClass::getDefaultDate(); // return DateTime('-1');
1 голос
/ 06 сентября 2011

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

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

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

0 голосов
/ 06 сентября 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 (поскольку это avaliablr только из php 5.3) или использовать простые__get и property_exist или использовать Reflection.Но на самом деле я не вижу проблемы, для которой нужно это решение.Извините ((

0 голосов
/ 06 сентября 2011

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

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

...