为什么我们必须将克隆分配给新变量?

Che*_*ker 5 php propel fluent-interface fluent

我目前正在学习使用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();
Run Code Online (Sandbox Code Playgroud)

但是,这不会按预期工作,因为现在对文章的查询将尝试查找类型为"新闻"和"文章"的条目,这当然是不可能的.

所以我们需要得到这个对象的克隆,对我来说似乎直观的是简单地在paranthesis中添加clone关键字:

$this->news = (clone $criteria)
        ->filterByType('news')
        ->find();
Run Code Online (Sandbox Code Playgroud)

Parse error: syntax error, unexpected T_OBJECT_OPERATOR

相反,我们必须先将它分配给变量才能使用它:

$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
        ->filterByType('news')
        ->find();
Run Code Online (Sandbox Code Playgroud)

您与new运营商具有相同的行为.我看到推进开发者通过替换:
new ArticleQuery()->doOperations()with来规避这个限制ArticleQuery::create()->doOperations().

为什么PHP语言设计者选择这样做?如果你可以直接使用这些表达式的结果,它将使代码更流畅,在某些情况下,更容易阅读.

web*_*ave 4

为什么我们必须将克隆分配给新变量?

不幸的是,答案是开发人员还没有开始支持对通过克隆返回的对象进行直接取消引用。

在 PHP 4 中,您无法“取消引用”方法返回的任何对象。您必须首先将其分配给虚拟变量。

在 PHP 的下一个版本中,将支持数组取消引用。

因此,很明显,开发团队在他们的时间表中逐步添加了此类功能。

我能告诉你的最好的办法就是向开发团队请求此功能。