Actualmente estoy aprendiendo a utilizar el ORM Propel, y quiero volver a utilizar un critera de dos consultas ligeramente diferentes:¿Por qué debemos asignar un clon a una nueva variable?
$criteria = ArticleQuery::create()
->filterByIsPublished(true)
->orderByPublishFrom(Criteria::DESC)
->joinWith('Article.Author')
->keepQuery();
$this->news = $criteria
->filterByType('news')
->find();
$this->articles = $critera
->filterByType('article')
->find();
Sin embargo, esto no va a funcionar como se esperaba, ya que ahora la consulta de los artículos a tratar para encontrar entradas donde el tipo es tanto 'noticias' como 'artículo', lo que por supuesto es imposible.
por lo que necesitamos para obtener un clon de este objeto, y lo que parecía intuitivo para mí era simplemente agregar la palabra clave clon dentro de un paréntesis:
$this->news = (clone $criteria)
->filterByType('news')
->find();
Parse error: syntax error, unexpected T_OBJECT_OPERATOR
En su lugar, se debe asignar a una variable antes de que podamos usarlo:
$clonedCritera = clone $criteria;
$this->news = $clonedCriteria
->filterByType('news')
->find();
Usted tiene el mismo comportamiento con el operador new
. Veo que los desarrolladores de propel han eludido esta limitación al reemplazar:
new ArticleQuery()->doOperations()
con ArticleQuery::create()->doOperations()
.
¿Por qué los diseñadores del lenguaje PHP eligieron hacerlo de esta manera? Si pudieras usar el resultado de estas expresiones directamente, el código sería más fluido y, en algunos casos, más fácil de leer.
Hrm. Me pregunto cuál de mis respuestas sería la menos inapropiada ... –
¿por qué? es de hecho una muy buena pregunta. "porque php no es java" fue la respuesta que recibí, cuando pregunté en algún foro sobre un problema de analizador similar con "nuevo". en mi opinión, el analizador php tiene muchos de esos defectos, solo podemos esperar que algún día se solucionen en el futuro ... – aurora
@harald Me encontré con esta página de RFC mientras investigaba esto, por lo que parece que la llamada a instancia de método es al menos bajo discusión entre los desarrolladores de PHP. https://wiki.php.net/rfc/instance-method-call – CheeseSucker