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

В настоящее время я учусь использовать 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 внутри парантеза:

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

Ошибка синтаксического анализа: синтаксическая ошибка, неожиданный T_OBJECT_OPERATOR

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

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

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

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

5
задан CheeseSucker 2 October 2011 в 21:03
поделиться