2011-10-02 2 views
5

현재 Propel ORM을 사용하고 있으며 두 개의 약간 다른 쿼리에 대해 critera를 다시 사용하고 싶습니다.새 변수에 복제를 지정해야하는 이유는 무엇입니까?

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

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

그러나 이제는 쿼리가 작동하지 않으므로 예상대로 작동하지 않습니다. 유형이 '뉴스'와 '기사'인 항목을 찾으십시오. 물론 불가능합니다.

그래서 우리는이 객체의 복제본을 가져와야합니다. 직관적으로 보았던 것은 단지 paranthesis 안에 clone 키워드를 추가하는 것이 었습니다 :

Parse error: syntax error, unexpected T_OBJECT_OPERATOR

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

new 연산자와 같은 동작을합니다. 나는 프로펠러 개발자가
new ArticleQuery()->doOperations()ArticleQuery::create()->doOperations()으로 대체함으로써이 제한을 우회하는 것을 본다.

왜 PHP 언어 디자이너는이 방법을 선택 했습니까? 이 표현식의 결과를 직접 사용할 수 있다면 코드가 더 유창하고 경우에 따라 읽기 쉽습니다.

+0

Hrm. 내 반응이 가장 부적절한 것이 아닌가 궁금합니다 ... –

+0

왜? 정말 좋은 질문입니다. "php가 자바가 아니기 때문에"나는 "new"라는 비슷한 구문 분석기 문제에 대해 포럼에서 질문했을 때 대답을 받았습니다. 제 생각에는 PHP 파서가 많은 결함을 가지고 있습니다. 우리는 언젠가는 미래에 언젠가는 고쳐질 것이라고 희망합니다. – aurora

+0

@harald이 RFC 페이지를 조사하면서이 메소드를 발견 했으므로 메소드 인스턴스 호출이 적어도 나타납니다 PHP 개발자들 사이에서 논의 중이다. https://wiki.php.net/rfc/instance-method-call – CheeseSucker

답변

4

왜 새 변수에 복제를 할당해야합니까?

불행히도, 대답은 개발자가 아직 복제를 통해 반환 된 객체에 대한 직접 참조 해제를 지원하지 않았다는 것입니다.

PHP 4에서는 개체가 메서드에서 반환 된 을 "참조 해제"할 수 없습니다. 더미 변수에 먼저 할당해야합니다.

PHP의 다음 버전에서는 array dereferencing이 지원됩니다.

dev 팀이 점차적으로 이러한 기능을 시간표에 추가한다는 것은 확실합니다.

내가 말할 수있는 가장 좋은 점은 개발팀의 request this functionality입니다.

+1

요청 전송 : https://bugs.php.net/bug.php?id=55833 – CheeseSucker

관련 문제