2011-10-02 11 views
5

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.

+0

Hrm. Me pregunto cuál de mis respuestas sería la menos inapropiada ... –

+0

¿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

+0

@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

Respuesta

4

¿Por qué debemos asignar un clon a una nueva variable?

Desafortunadamente, la respuesta es que los desarrolladores no han logrado apoyar la desreferenciación directa en los objetos devueltos a través de clones.

En PHP 4, no se pudo "eliminar la referencia" ningún objeto devuelto por el método. Tuviste que asignarlo a una variable ficticia primero.

En la próxima versión de PHP, array dereferencing es compatible.

Por lo tanto, está claro que el equipo de desarrollo agrega incrementalmente tales características en sus horarios.

Lo mejor que puedo decir es que request this functionality del equipo de desarrollo.

+1

Solicitud enviada: https://bugs.php.net/bug.php?id=55833 – CheeseSucker

Cuestiones relacionadas