Почему мы должны присвоить клон новой переменной? - PullRequest
5 голосов
/ 03 октября 2011

В настоящее время я учусь использовать Propel ORM и хочу повторно использовать критерий для двух слегка отличающихся запросов:

$criteria = ArticleQuery::create()
        ->filterByIsPublished(true)
        ->orderByPublishFrom(Criteria::DESC)
        ->joinWith('Article.Author')
        ->keepQuery();

$this->news = $criteria
        ->filterByType('news')
        ->find();
$this->articles = $critera
        ->filterByType('article')
        ->find();

Однако это не будет работать, как ожидалось, потому что теперь запрос длястатьи будут пытаться найти записи, где типом являются «новости» и «статьи», что, конечно, невозможно.

Итак, нам нужно получить клон этого объекта, и то, что мне показалось интуитивным, былопросто добавьте ключевое слово clone внутри paranthesis:

$this->news = (clone $criteria)
        ->filterByType('news')
        ->find();

Parse error: syntax error, unexpected T_OBJECT_OPERATOR

Вместо этого мы должны присвоить его переменной, прежде чем мы сможем его использовать:

$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
        ->filterByType('news')
        ->find();

У вас такое же поведение с оператором new.Я вижу, что разработчики Propel обошли это ограничение, заменив:
new ArticleQuery()->doOperations() на ArticleQuery::create()->doOperations().

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

1 Ответ

4 голосов
/ 03 октября 2011

Почему мы должны присвоить клон новой переменной?

К сожалению, ответ таков: разработчики еще не удосужились поддержать прямую разыменование объектов, возвращаемых через клон.

В PHP 4 вы не можете "разыменовать" любые объекты, возвращаемые методом. Сначала нужно было присвоить его фиктивной переменной.

В следующей версии PHP будет поддерживаться разыменование массива .

Итак, ясно, что команда разработчиков постепенно добавляет такие функции в свое расписание.

Лучшее, что я могу вам сказать, это запросить эту функциональность у команды разработчиков.

...