Php 为什么我们必须将克隆分配给新变量?
我目前正在学习使用推进ORM,我想为两个稍微不同的查询重用一个critera:Php 为什么我们必须将克隆分配给新变量?,php,propel,fluent,fluent-interface,Php,Propel,Fluent,Fluent Interface,我目前正在学习使用推进ORM,我想为两个稍微不同的查询重用一个critera: $criteria = ArticleQuery::create() ->filterByIsPublished(true) ->orderByPublishFrom(Criteria::DESC) ->joinWith('Article.Author') ->keepQuery(); $this->news = $cri
$criteria = ArticleQuery::create()
->filterByIsPublished(true)
->orderByPublishFrom(Criteria::DESC)
->joinWith('Article.Author')
->keepQuery();
$this->news = $criteria
->filterByType('news')
->find();
$this->articles = $critera
->filterByType('article')
->find();
但是,这不会像预期的那样工作,因为现在对文章的查询将尝试查找类型同时为“news”和“article”的条目,这当然是不可能的
所以我们需要得到这个对象的克隆,我觉得直观的做法是简单地在paranthesis中添加克隆关键字:
$this->news = (clone $criteria)
->filterByType('news')
->find();
分析错误:语法错误,意外的T\u对象\u运算符
相反,我们必须先将其分配给变量,然后才能使用它:
$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
->filterByType('news')
->find();
您与new
操作符具有相同的行为。我看到propel开发者通过替换:newarticlequery()->doOperations()
与ArticleQuery::create()->doOperations()
为什么PHP语言设计者选择这样做?如果您可以直接使用这些表达式的结果,它将使代码更加流畅,并且在某些情况下更易于阅读
为什么我们必须将克隆分配给新变量
不幸的是,答案是开发人员还没有开始支持对通过克隆返回的对象的直接解引用
在PHP4中,您不能“取消引用”方法返回的任何对象。您必须首先将其分配给虚拟变量
在下一版本的PHP中,将支持
因此,很明显,开发团队会在他们的时间表上逐步增加这些特性
我所能告诉您的最好消息是与开发团队联系。Hrm。我想知道我的回答中哪一个最不合适…为什么?这确实是一个很好的问题。“因为php不是java”是我在某个论坛上用“new”询问类似解析器问题时得到的答案。在我看来,php解析器有很多这样的缺陷——我们只能希望,它们在将来的某一天会被修复…@harald我在研究这个问题时遇到了这个RFC页面,所以看起来方法实例调用至少在php开发人员中正在讨论。