2011-03-02 15 views
12

मैं समझता हूं कि यह कैसे काम करता है लेकिन हम इसका व्यावहारिक रूप से उपयोग क्यों करेंगे?हम कहां और क्यों PHP में __toString() का उपयोग करते हैं?

<?php 
    class cat { 
     public function random_method() { 
      echo "This is a cat\n"; 
     } 
    } 

    $toby = new cat; 
    $toby->random_method(); 
?> 

हम सिर्फ किसी भी पाठ उत्पादन के लिए किसी भी अन्य सार्वजनिक विधि का उपयोग नहीं कर सकते हैं:

<?php 
    class cat { 
     public function __toString() { 
      return "This is a cat\n"; 
     } 
    } 

    $toby = new cat; 
    print $toby; 
?> 

इस इस के समान नहीं है? हमें इस तरह की जादू विधि की आवश्यकता क्यों है?

+0

एस/यादृच्छिक/मनमानी/ –

उत्तर

11

आपको इसकी आवश्यकता नहीं है। लेकिन इसे परिभाषित करने से आपकी ऑब्जेक्ट को स्ट्रिंग में रूपांतरित रूप से परिवर्तित किया जा सकता है, जो सुविधाजनक है।

सदस्य कार्य होने के कारण echo सीधे खराब रूप माना जाता है क्योंकि यह कक्षा में आउटपुट का बहुत अधिक नियंत्रण देता है। आप सदस्य कार्यों से तारों को वापस करना चाहते हैं, और कॉलर को यह तय करने दें कि उनके साथ क्या करना है: चाहे उन्हें एक चर में स्टोर किया जाए, या echo उन्हें बाहर या, जो भी हो। जादू कार्य का उपयोग करने का मतलब है कि आपको ऐसा करने के लिए स्पष्ट फ़ंक्शन कॉल की आवश्यकता नहीं है।

+0

आप उन्हें इस विधि को एक var में संग्रहीत करने के लिए कैसे कहते हैं। यदि आपके पास स्ट्रिंग क्लास नामक एक कक्षा थी तो क्या आप इसे ऐसा कर सकते हैं? '$ stringClass = नया स्ट्रिंग क्लास(); $ स्ट्रिंग = (स्ट्रिंग) $ stringClass'। जैसा कि '$ string = $ stringClass' असाइन करना ऑब्जेक्ट असाइन करेगा। – SamBremner

+0

@SamBremner: यह रूपांतरण _explicitly_ को ट्रिगर करने के तरीके के रूप में उचित दिखता है (इसे आज़माएं और देखें कि क्या होता है!)। लेकिन असली शक्ति अंतर्निहित रूपांतरण में है, अन्यथा आप अपने स्वयं के 'toString()' फ़ंक्शन, या किसी अन्य नाम के साथ एक समान फ़ंक्शन भी बना सकते हैं)। –

-1

__toString() का उपयोग ऑपरेटर को ओवरराइड करता है जिसे आप उस वर्ग की ऑब्जेक्ट प्रिंट करते समय बुलाते हैं, इसलिए यह आपके लिए कॉन्फ़िगर करना आसान बनाता है कि उस वर्ग का ऑब्जेक्ट कैसे प्रदर्शित किया जाना चाहिए।

+0

कोई ऑपरेटर ओवरलोडिंग/ओवरराइडिंग नहीं है। ऑब्जेक्ट को स्ट्रिंग में कनवर्ट करने पर विधि को कॉल किया जाता है। – BoltClock

1

__toString आपकी ऑब्जेक्ट को स्ट्रिंग में परिवर्तित होने पर आउटपुट को परिभाषित करने की अनुमति देता है। इसका मतलब यह है कि आप फ़ंक्शन के वापसी मूल्य की बजाय ऑब्जेक्ट को print कर सकते हैं। यह अक्सर अधिक सुविधाजनक है। the manual entry देखें।

4

यह सिर्फ एक मानकीकृत विधि एक वस्तु की एक स्ट्रिंग प्रतिनिधित्व के उत्पादन के लिए है की तरह व्यवहार किया जाता है प्रतिक्रिया करेंगे एक वर्ग अनुमति देता है। आपका random_method दृष्टिकोण काम करता है यदि आप मानते हैं कि आपके प्रोग्राम में सभी ऑब्जेक्ट्स उसी विधि का उपयोग करते हैं, जो कि यदि आप तृतीय पक्ष पुस्तकालयों का उपयोग करते हैं तो यह मामला नहीं हो सकता है।

आपको जादू विधि की आवश्यकता नहीं है, लेकिन यह सुविधा प्रदान करता है, क्योंकि आपको इसे स्पष्ट रूप से स्पष्ट रूप से कॉल नहीं करना पड़ेगा।

इसके अलावा, यदि PHP आंतरिक रूप से कभी भी आपके ऑब्जेक्ट को टेक्स्ट में बदलना चाहता है, तो यह जानता है कि यह कैसे करें।

0

आपको विशेष रूप से ToString विधि को कॉल करने की आवश्यकता नहीं है। जब भी आप ऑब्जेक्ट को प्रिंट करते हैं तो स्ट्रिंग को पूरी तरह से कहा जा रहा है। किसी अन्य विधि को स्पष्ट रूप से बुलाया जाना चाहिए।

3

__toString() किसी ऑब्जेक्ट को फ़ंक्शन (एएसपी echo() या print()) पर पारित किया जाता है, जब इसका संदर्भ स्ट्रिंग होने की अपेक्षा की जाती है। चूंकि कोई ऑब्जेक्ट स्ट्रिंग नहीं है, __toString() ऑब्जेक्ट के कुछ स्ट्रिंग प्रस्तुति में परिवर्तन को संभालता है।

7

सभी मौजूदा जवाब के अलावा, यहां एक उदाहरण दिया,:

class Assets{ 

    protected 
    $queue = array(); 

    public function add($script){ 
    $this->queue[] = $script; 
    } 

    public function __toString(){  
    $output = '';  
    foreach($this->queue as $script){ 
     $output .= '<script src="'.$script.'"></script>'; 
    }  
    return $output; 
    } 

} 


$scripts = new Assets(); 

यह एक सरल वर्ग आप javascripts प्रबंधन में मदद करती है। आप $scripts->add('...') पर कॉल करके नई स्क्रिप्ट पंजीकृत करेंगे।

फिर कतार को संसाधित करने और सभी पंजीकृत स्क्रिप्ट प्रिंट करने के लिए बस print $scripts; पर कॉल करें।

स्पष्ट रूप से यह वर्ग इस रूप में व्यर्थ है, लेकिन यदि आप परिसंपत्ति निर्भरता, संस्करण, डुप्लिकेट समावेशन आदि के लिए जांच लागू करते हैं, तो यह समझ में आता है (example)।

मूल विचार इस वस्तु का मुख्य उद्देश्य एक स्ट्रिंग (एचटीएमएल) बनाने के लिए है कि है, इसलिए इस मामले में __toString के उपयोग के लिए सुविधाजनक है ...

-2

यह ग # साथ ओवरराइड की तरह है:

class Person 

{ 

public Person(string firstName, string lastName) 

{ 

FirstName = firstName; 

LastName = lastName; 

} 

public string FirstName { get; set; } 

public string LastName { get; set; } 

public override string ToString() 

{ 

return FirstName + “ “ + LastName; 

} 

} 
+2

यह एक php सवाल है। यह कैसे मदद करता है ?? – Akintunde007

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