2011-10-02 2 views
5

は、私は現在の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言語デザイナーはこのようにしたのですか?あなたが直接これらの式の結果を使用することができれば、それはコードをより流暢と、いくつかのケースでは、読みやすくなるだろう。

+0

Hrm。私の反応の中で、最も不適切なものはどれかと思っています... –

+0

なぜですか?確かに本当に良い質問です。 "phpはjavaではないので"私が受け取った答えは、私が "new"という同様のパーサの問題についていくつかのフォーラムで尋ねたときでした。私の意見では、PHPパーサーは多くのそのような欠陥を持っています - 私たちは将来彼らがいつか将来には固定されることを願っています... – aurora

+0

@haraldこれを研究している間に私はこのRFCページを見つけました。 PHP開発者の間で協議中です。 https://wiki.php.net/rfc/instance-method-call – CheeseSucker

答えて

4

なぜ新しい変数にクローンを割り当てる必要がありますか?

残念なことに、答えは、開発者がまだクローン経由で返されたオブジェクトに対して直接逆参照をサポートすることを諦めていないことです。

PHP 4では、メソッドによって返されたのオブジェクトをで「参照解除」できませんでした。最初にダミー変数に割り当てる必要がありました。

PHPの次のバージョンでは、array dereferencingがサポートされます。

devチームがこのような機能を徐々にタイムテーブルに追加していることは明らかです。

私があなたに伝えることができるのは、開発チームのrequest this functionalityです。

+1

リクエスト送信:https://bugs.php.net/bug.php?id=55833 – CheeseSucker

関連する問題