我目前正在学习使用Propel ORM,我想重用一个critera用于两个略有不同的查询:
$criteria = ArticleQuery::create()
->filterByIsPublished(true)
->orderByPublishFrom(Criteria::DESC)
->joinWith('Article.Author')
->keepQuery();
$this->news = $criteria
->filterByType('news')
->find();
$this->articles = $critera
->filterByType('article')
->find();
但是,这不会按预期工作,因为现在对文章的查询将尝试查找类型为“新闻”和“文章”的条目,这当然是不可能的。
所以我们需要得到这个对象的克隆,对我来说似乎直观的是简单地在paranthesis中添加clone关键字:
$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
运算符具有相同的行为。我看到推进开发商通过更换以下来规避这一限制:
new ArticleQuery()->doOperations()
与ArticleQuery::create()->doOperations()
。
为什么PHP语言设计师会选择这样做?如果你可以直接使用这些表达式的结果,它将使代码更流畅,在某些情况下,更容易阅读。
答案 0 :(得分:4)
为什么我们必须将克隆分配给新变量?
不幸的是,答案是开发人员还没有支持对通过克隆返回的对象进行直接解除引用。
在PHP 4中,您无法“取消引用”方法返回的任何对象。您必须先将其分配给虚拟变量。
在下一版本的PHP中,支持array dereferencing。
因此,很明显开发团队会逐步在他们的时间表上添加这些功能。
我能告诉你的最好的是来自开发团队的request this functionality。