2011-12-14 14 views
16
पर बुलाया

संभव डुप्लिकेट:
Count elements for objects implementing ArrayAccess using count()?गिनती के व्यवहार (अधिभार) जब कुछ वस्तुओं

PHP 5 में, आप, जादू तरीकों का उपयोग कर सकते हैं कुछ कक्षाएं, आदि ओवरलोड में सी ++, आप उन कार्यों को कार्यान्वित कर सकते हैं जो तब तक मौजूद हैं जब तक तर्क प्रकार भिन्न होते हैं। PHP में ऐसा करने का कोई तरीका है?

मैं क्या करना चाहते हैं क्या का एक उदाहरण यह है:

class a { 
    function a() { 
     $this->list = array("1", "2"); 
    } 
} 

$blah = new a(); 

count($blah); 

मैं blah वापस जाने के लिए 2. आईई कक्षा में एक विशिष्ट सरणी के मूल्यों गिनती करना चाहते हैं। मूल रूप से

int count(a varName) { return count(varName->list); } 

, मैं इतना मैं यह कर कॉल कर सकते हैं एक बड़ी आवेदन के लिए डेटा कॉल्स को आसान बनाने की कोशिश कर रहा हूँ:: तो सी ++ में, जिस तरह से मैं यह करना होगा ऐसा दिखाई दे सकता

count($object); 

बल्कि अगर किसी को यह वर्तमान तरीके से करना है की तुलना में

count($object->list); 

सूची संभावित वस्तुओं तो उसके उपयोग के तरीके पर निर्भर करता है की एक सूची होने जा रहा है, यह वास्तव में बुरा बयान हो सकता है:

count($object->list[0]->list[0]->list); 

तो, मैं यह करने के लिए कुछ इसी तरह बना सकते हैं:

function count(a $object) { 
    count($object->list); 
} 

मैं जानता हूँ कि PHP के गिनती एक मिश्रित वर को स्वीकार करता है, तो मैं अगर मैं एक व्यक्ति के प्रकार ओवरराइड कर सकते हैं पता नहीं है।

+0

ध्यान दें: आप एसटीएल कार्यों को ओवरलोड नहीं कर सकते हैं ... –

+0

यह आप [गिनती डॉक्स पेज] पर जवाब बताता है (http://php.net/manual/en/function.count.php) । "ऑब्जेक्ट्स के लिए, यदि आपके पास एसपीएल स्थापित है, तो आप इंटरफ़ेस को कार्यान्वित करके गिनती() में हुक कर सकते हैं। इंटरफ़ेस में बिल्कुल एक विधि है, काउंटरबल :: गिनती(), जो गिनती() फ़ंक्शन के लिए रिटर्न मान देता है।" – Greg

उत्तर

31

ऐसा लगता है कि आप Countable इंटरफ़ेस को लागू करना चाहते हैं:

class a implements Countable { 
    public function __construct() { 
     $this->list = array("1", "2"); 
    } 

    public function count() { 
     return count($this->list); 
    } 
} 

$blah = new a(); 

echo count($blah); // 2 
21

tl; डॉ - जवाब नीचे :)

PHP में से है, इस मॉडल उलट है; अलग-अलग तर्क प्रकारों के साथ कार्यों को ओवरलोडिंग (विधियों नहीं) के बजाय, प्रत्येक वर्ग का मतलब उन कार्यों में से प्रत्येक के लिए जादू विधियों को परिभाषित करना है।

नीचे उन कार्यों की सूची है जो magic behaviour को आपकी कक्षा के अंदर परिभाषित किया जा सकता है। उदाहरणों में, $obj का प्रत्येक संदर्भ आपकी कक्षा का एक उदाहरण है, ->unknown एक लापता संपत्ति को संदर्भित करता है और ->blamethod() एक अनुपलब्ध विधि को संदर्भित करता है।

  1. __toString() - जब आपके वस्तु एक स्ट्रिंग संदर्भ में प्रयोग किया जाता है इस विधि कहा जाता है, जैसे कि echo "My object is: $obj\n";

  2. __invoke([$arg1..n]) - जब आपकी ऑब्जेक्ट को फ़ंक्शन के रूप में उपयोग किया जाता है, तो इस विधि को कॉल किया जाता है, उदा। $obj($a, $b);

  3. __get($prop) - आपकी कक्षा की एक गैर-मौजूदा संपत्ति तक पहुंचने के प्रयास को रोकने में मदद करता है, उदाहरण के लिए$obj->unknown; बीटीडब्ल्यू, इसे कभी-कभी आलसी लोड कुछ गुणों के रूप में उपयोग किया जा सकता है जो अन्यथा कन्स्ट्रक्टर में किए जाने पर प्रसंस्करण की काफी मात्रा लेते हैं।

  4. __set($prop, $value) - एक गैर-मौजूदा संपत्ति सेट होने पर कॉल किया जाता है, उदा। $obj->unknown = 42;

  5. __isset($prop) - एक गैर-मौजूदा संपत्ति के अस्तित्व को निर्धारित करने के लिए कहा जाता है (मुझे लगता है कि यह कितना मजाकिया लगता है), उदा। isset($obj->unknown) कहेंगे $obj->__isset('unknown')

  6. __unset($prop) - इन unset($obj->unknown);

  7. __call($name, $arguments) तरह के मामलों में कहा जाता है - अपने वर्ग, उदा के लागू नहीं किया गया विधि के लिए एक कॉल को बीच में रोक $obj->blamethod(1, 2, 3);$obj->__call('blamethod', array(1, 2, 3));

  8. __callStatic($name, $arguments) लागू करेगा - __call() की तरह, लेकिन आप अपने कार्यान्वयन के अंदर $this उपयोग करने में सक्षम नहीं होगा।

  9. __clone() - जिसे $x = clone $obj; कहा जाता है, इसलिए आप यह तय कर लेते हैं कि कौन सा डेटा रखा गया है और क्या फेंक दिया गया है।

एसपीएल के साथ, कुछ और अवधारणाओं को लागू करने certain interfaces के माध्यम से पेश किया गया:

  1. Traversable - एक अमूर्त इंटरफेस को परिभाषित करता है क्या जब एक foreach निर्माण में प्रयोग किया जाता अपने वर्ग करता है, कंक्रीट इंटरफ़ेस को Iterator कहा जाता है।

  2. ArrayAccess - एक इंटरफ़ेस जो आपकी कक्षा के उदाहरणों को सरणी की तरह उपयोग करने की अनुमति देता है।

  3. Serializable - एक इंटरफ़ेस जो serialize() या unserialize() पर दो विधियों को परिभाषित करने के लिए परिभाषित करता है। यह __sleep() और __wakeup() का उपयोग करने के लिए पारस्परिक रूप से अनन्य है।

  4. Countable - परिभाषित करता है जब भी count() अपनी कक्षा उदाहरण पर किया जाता है एक विधि कहा जाता है।

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