2009-06-09 14 views
6

किसी ने मुझे बता सकते हैं क्याकक्षा को विस्तारित करने और PHP में इसे शामिल करने के बीच क्या अंतर है?

include_once 'classb.php' 
class A 
{ 
    $a = new B 
} 

और

class A extends B 
{ 
    $a = new B 
} 

के बीच का अंतर है?

.php फ़ाइल सहित कक्षा बनाम विस्तार करने के लिए क्या फायदे/नुकसान हैं?

उत्तर

8

आपका include_once एक स्रोत फ़ाइल में पढ़ता है, जो इस मामले में संभवतः B के लिए कक्षा परिभाषा है। आपके extends को inheriting वर्ग B के रूप में सेट करता है, यानी AB में सबकुछ प्राप्त करता है और फिर उस मूल संरचना में अपने स्वयं के संशोधनों को परिभाषित कर सकता है। दोनों परिचालनों के बीच वास्तव में कोई संबंध नहीं है, और आपके $a = new B संचालन गैरकानूनी हैं (वाक्यविन्यास त्रुटियों का उल्लेख नहीं है)।

6

मामले में आप एक उच्च स्तर जवाब की तलाश में हैं ...

का उपयोग फैली इसी तरह बी को काम करने, जबकि एक के भीतर बी का उदाहरण बनाकर ए पर कोई प्रतिबंध नहीं लगाता करने के लिए एक बांधता

दूसरे दृष्टिकोण को संरचना कहा जाता है और आमतौर पर ओओ सिस्टम बनाने के लिए पसंदीदा दृष्टिकोण होता है क्योंकि यह लंबे वर्ग पदानुक्रमों का उत्पादन नहीं करता है और यह अधिक लचीला दीर्घकालिक होता है। हालांकि यह थोड़ा धीमा कोड उत्पन्न करता है, और इसके अधिक से अधिक विस्तार के सरल उपयोग से अधिक होता है।

मेरे 2 Cents

+0

क्या धीमी है विस्तार या सहित मैं सिर्फ एक छोटे से बेंचमार्क किया था, और मैंने पाया है कि विस्तार कोड थोड़ा धीमा हो जाता है यह आप क्या मतलब है।।?।? – daniel

+1

कहें कि मैं ए पर फू को आमंत्रित करना चाहता हूं यह बी को foo प्रतिनिधि करता है, तो संरचना दृष्टिकोण में दो विधि कॉल के लिए समय लिया जाएगा। यदि ए बी बढ़ाता है तो ए पर फू को आविष्कार करना 1 विधि कॉल माना जाता है और कक्षाओं को परिभाषित किए जाने के अलावा लुकअप की कोई आवश्यकता नहीं होती है (जो एक बार होता है)। –

1

सबसे पहले, शामिल एक आदेश है कि एक php स्रोत फ़ाइल पढ़ सकते हैं और व्यवहार करता है के रूप में यह शामिल निर्देश के स्थान पर लिखा गया था है। आप इसे किसी भी php स्रोत फ़ाइल पर उपयोग कर सकते हैं और वर्ग विरासत से संबंधित नहीं है।

वैसे, यदि आप कक्षा ए स्रोत कोड वाली फ़ाइल शामिल नहीं करते हैं तो आप उस वर्ग को विस्तारित नहीं कर सकते हैं।

कीवर्ड के साथ कक्षा को विस्तारित करें ऑब्जेक्ट उन्मुख प्रोग्रामिंग में एक महत्वपूर्ण अवधारणा है जो विरासत की अवधारणा को दर्शाता है।

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

विरासत के विपरीत संरचना है। रचना के साथ आप वांछित व्यवहार प्राप्त करने के लिए कक्षाओं को अपने व्यवहार को बदलने के लिए विस्तारित नहीं करते हैं, इसके बजाय आपको कक्षाओं का एक पैचवर्क करना होता है।

विकिपीडिया पर आप object composition पर एक बेहतर विवरण और [वर्ग विरासत] (http://en.wikipedia.org/wiki/Inheritance_(computer_science))

ऐसा लगता है इन अवधारणाओं पर एक छोटे से confusione है, जैसा कि आप एक ही समय में अपने वर्ग एक का विस्तार करने और, पा सकते हैं, तो आप इसे लिखने का प्रयास करें (वैसे, सही वाक्यविन्यास $ ए = नया बी();) है।

यह एक उपयोगी संदर्भ, जाहिर है, [GOF, डिजाइन पैटर्न] (http://en.wikipedia.org/wiki/Design_Patterns_(book))

2

दूसरा, यानी विस्तार, - वर्ग ऑपरेशन है पहले, यानी शामिल हैं -। फ़ाइल आपरेशन, (संकलन से पहले) है

तो - दूसरे संभव नहीं कभी है पहले बिना

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

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