2011-10-02 13 views
5

Obecnie uczę się używać Propel ORM i chcę, aby ponownie użyć critera dwóch nieco innych zapytań:Dlaczego musimy przypisać klon do nowej zmiennej?

$criteria = ArticleQuery::create() 
     ->filterByIsPublished(true) 
     ->orderByPublishFrom(Criteria::DESC) 
     ->joinWith('Article.Author') 
     ->keepQuery(); 

$this->news = $criteria 
     ->filterByType('news') 
     ->find(); 
$this->articles = $critera 
     ->filterByType('article') 
     ->find(); 

Jednak to nie będzie działać zgodnie z oczekiwaniami, ponieważ teraz zapytanie o artykułach postaram aby znaleźć wpisy, w których typ jest zarówno "nowością", jak i "artykułem", co oczywiście jest niemożliwe.

Więc musimy klon tego obiektu, a co wydawało intuicyjny dla mnie było po prostu dodać słowo kluczowe klon wewnątrz nawiasach:

$this->news = (clone $criteria) 
     ->filterByType('news') 
     ->find(); 

Parse error: syntax error, unexpected T_OBJECT_OPERATOR

Zamiast tego musimy przypisać go do zmienna, zanim można go użyć:

$clonedCritera = clone $criteria; 
$this->news = $clonedCriteria 
     ->filterByType('news') 
     ->find(); 

masz ten sam problem z operatorem new. Widzę, że twórcy napędów optycznych ominęli to ograniczenie, zastępując:
new ArticleQuery()->doOperations() z ArticleQuery::create()->doOperations().

Dlaczego projektanci języka PHP postanowili zrobić to w ten sposób? Jeśli możesz bezpośrednio użyć wyniku tych wyrażeń, sprawi to, że kod będzie bardziej płynny, aw niektórych przypadkach łatwiejszy do odczytania.

+0

Hrm. Zastanawiam się, która z moich odpowiedzi byłaby najmniej nieodpowiednia ... –

+0

dlaczego? to naprawdę dobre pytanie. "ponieważ php nie jest java" to była odpowiedź, którą otrzymałem, gdy zapytałem na jakimś forum o podobnym problemie z parserem z "nowym". moim zdaniem parser php ma wiele takich wad - możemy tylko mieć nadzieję, że zostaną one naprawione pewnego dnia w przyszłości ... – aurora

+0

@harald Natknąłem się na tę stronę RFC podczas badania tego, więc wygląda na to, że wywołanie metody metody jest co najmniej pod dyskusją wśród programistów PHP. https://wiki.php.net/rfc/instance-method-call – CheeseSucker

Odpowiedz

4

Dlaczego musimy przypisać klon do nowej zmiennej?

Niestety, deweloperzy nie otrzymali wsparcia w zakresie bezpośredniej dereferencji na obiektach zwróconych przez klon.

W PHP 4, nie można "dereferencji" żadnych obiektów zwracanych przez metodę. Najpierw musiałeś przypisać go do zmiennej obojętnej.

W następnej wersji PHP ma być obsługiwana wersja array dereferencing.

Jest więc oczywiste, że zespół programistów stopniowo dodaje takie funkcje do harmonogramu.

Najlepsze, co mogę państwu powiedzieć, to request this functionality od zespołu programistów.

+1

Żądanie wysłane: https://bugs.php.net/bug.php?id=55833 – CheeseSucker

Powiązane problemy