Attualmente sto imparando a usare il Propel, e voglio riutilizzare un critera per due query leggermente diversi:Perché dobbiamo assegnare un clone a una nuova variabile?
$criteria = ArticleQuery::create()
->filterByIsPublished(true)
->orderByPublishFrom(Criteria::DESC)
->joinWith('Article.Author')
->keepQuery();
$this->news = $criteria
->filterByType('news')
->find();
$this->articles = $critera
->filterByType('article')
->find();
Tuttavia, questo non funzionerà come previsto, perché ora la query per gli articoli proverà per trovare voci in cui il tipo è sia 'notizie' che 'articolo', che ovviamente è impossibile.
Così abbiamo bisogno di ottenere un clone di questo oggetto, e quello che sembrava intuitivo per me era semplicemente aggiungere la parola clone all'interno paranthesis:
$this->news = (clone $criteria)
->filterByType('news')
->find();
Parse error: syntax error, unexpected T_OBJECT_OPERATOR
Invece dobbiamo assegnarlo a una variabile prima di poter usare:
$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
->filterByType('news')
->find();
Hai lo stesso comportamento con l'operatore new
. Vedo che gli sviluppatori della propulsione hanno aggirato questa limitazione sostituendo:
new ArticleQuery()->doOperations()
con ArticleQuery::create()->doOperations()
.
Perché i progettisti di linguaggio PHP hanno scelto di farlo in questo modo? Se si potesse usare direttamente il risultato di queste espressioni, renderebbe il codice più fluido e, in alcuni casi, più facile da leggere.
Hrm. Mi chiedo quale delle mie risposte sarebbe meno inappropriata ... –
perché? è davvero una bella domanda. "perché php non è java" è stata la risposta che ho ricevuto, quando ho chiesto in qualche forum un problema simile al parser con "nuovo". a mio parere l'analizzatore php ha molti di questi difetti - possiamo solo sperare, che un giorno verranno risolti in futuro ... – aurora
@harald Ho trovato questa pagina RFC mentre cercavo questo, quindi sembra che la chiamata all'istanza di metodo sia almeno in discussione tra gli sviluppatori PHP. https://wiki.php.net/rfc/instance-method-call – CheeseSucker