2011-10-02 8 views
5

मैं वर्तमान में प्रोपेल ORM उपयोग करने के लिए सीख रहा हूँ, और मैं दो थोड़ा अलग प्रश्नों के लिए एक शर्तों को पूरा करते पुन: उपयोग करना चाहते हैं:हमें एक नए चर के लिए क्लोन क्यों आवंटित करना चाहिए?

$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 अंदर क्लोन कीवर्ड जोड़ने के लिए था लग रहा था:

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

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

एचआरएम। मुझे आश्चर्य है कि मेरे कौन से प्रतिक्रिया कम से कम अनुचित होंगे ... –

+0

क्यों? वास्तव में वास्तव में एक अच्छा सवाल है। "क्योंकि php जावा नहीं है" मुझे जवाब मिला, जब मैंने कुछ नए फोरम मुद्दे को "नया" के बारे में पूछा। मेरी राय में php पार्सर में ऐसी कई त्रुटियां हैं - हम केवल उम्मीद कर सकते हैं कि उन्हें भविष्य में किसी दिन तय किया जाएगा ... – aurora

+0

@harald मैं इस शोध के दौरान इस आरएफसी पेज पर आया, इसलिए ऐसा लगता है कि विधि उदाहरण कॉल कम से कम है PHP डेवलपर्स के बीच चर्चा के तहत। https://wiki.php.net/rfc/instance-method-call – CheeseSucker

उत्तर

4

हमें एक नए चर के लिए क्लोन क्यों असाइन करना चाहिए?

दुर्भाग्यवश, इसका जवाब यह है कि डेवलपर्स क्लोन के माध्यम से वापस आने वाली वस्तुओं पर प्रत्यक्ष डेरफ़्रेंसिंग का समर्थन करने के लिए नहीं मिल पाए हैं।

PHP 4 में, आप किसी भी विधि द्वारा लौटाई गई वस्तुओं को "अव्यवस्था" नहीं कर सका। आपको इसे पहले एक डमी वैरिएबल को असाइन करना था।

PHP के अगले संस्करण में, array dereferencing समर्थित होना है।

तो, यह स्पष्ट है कि देव टीम अपने समय सारिणी पर ऐसी सुविधाओं को जोड़ती है।

सबसे अच्छा मैं आपको बता सकता हूं कि देव टीम से request this functionality है।

+1

अनुरोध भेजा गया: https://bugs.php.net/bug.php?id=55833 – CheeseSucker

संबंधित मुद्दे