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.
Hrm. Zastanawiam się, która z moich odpowiedzi byłaby najmniej nieodpowiednia ... –
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
@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