は、私は現在のPropel ORMを使用することを学んでいます、と私はわずかに異なる2つのクエリに対して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内のクローンキーワードを追加しました:
$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()
で:私はPropelの開発者が交換することにより、この制限を回避している参照してください。
なぜPHP言語デザイナーはこのようにしたのですか?あなたが直接これらの式の結果を使用することができれば、それはコードをより流暢と、いくつかのケースでは、読みやすくなるだろう。
Hrm。私の反応の中で、最も不適切なものはどれかと思っています... –
なぜですか?確かに本当に良い質問です。 "phpはjavaではないので"私が受け取った答えは、私が "new"という同様のパーサの問題についていくつかのフォーラムで尋ねたときでした。私の意見では、PHPパーサーは多くのそのような欠陥を持っています - 私たちは将来彼らがいつか将来には固定されることを願っています... – aurora
@haraldこれを研究している間に私はこのRFCページを見つけました。 PHP開発者の間で協議中です。 https://wiki.php.net/rfc/instance-method-call – CheeseSucker