2012-04-07 17 views
20

हमें PHP में कक्षाओं के साथ गुणों का विस्तार करने की अनुमति क्यों नहीं है?PHP में कक्षाओं के साथ लक्षण बढ़ाएं?

उदाहरण के लिए:

Trait T { } 

Class C use T {} 
/* or */ 
Class C extends T {} 

इस तरह के वाक्य रचना के लिए किसी भी संभावित संघर्ष है? मुझे ऐसा नहीं लगता है।

+0

कैसे 'कक्षा सी का प्रयोग करेंगे टी {}' से अलग हो क्या हम पहले से ही है (थोड़ा अलग वाक्यविन्यास के अलावा)? – Jon

+0

छोटे वाक्यविन्यास जब मैं बेस क्लास से कुछ वर्ग का विस्तार करना चाहता हूं लेकिन विशेषता का उपयोग कर रहा हूं। – Meglio

+1

@ मेग्लियो: बस इसे करें: 'कक्षा सी आधार {उपयोग टी} 'बढ़ाता है। – hakre

उत्तर

5

केवल कक्षाएं बढ़ा दी जा सकती हैं। लक्षण कक्षाएं हैं। उन्हें कक्षाओं द्वारा इस्तेमाल/शामिल किया जा सकता है लेकिन कक्षाएं स्वयं नहीं हैं। यदि आपको लगता है कि एक विशेषता को विस्तारित करने की आवश्यकता है तो शायद यह एक वर्ग होना चाहिए, शायद एक सारणी, और एक विशेषता नहीं है।

+0

यहां विचार छोटे वाक्यविन्यास के लिए है, वास्तव में लक्षणों का विस्तार करने के तरीके के लिए नहीं। – Meglio

+3

@Meglio: वाक्यविन्यास की कोई लंबाई नहीं है, इसलिए कोई छोटा वाक्यविन्यास नहीं है। – hakre

+0

कम नोटेशन। – Meglio

31

पीएचपी मैनुअल राज्यों इस प्रकार:

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

यदि आप एक विशेषता का विस्तार करना चाहते हैं, तो यह शायद एक वर्ग होना चाहिए। यदि आपके पास एक वर्ग में विधियों का एक सेट है जिसे आप दूसरों में उपयोग करना चाहते हैं, लेकिन कक्षा (उदाहरण के लिए class Animal extends Vehicle) का विस्तार करना अनुचित लगता है, तो PHP 5.4 में यह एक विशेषता के रूप में अच्छी तरह से काम कर सकता है।

अधिक प्रश्न का उत्तर देने के लिए, आप एक विशेषता का विस्तार नहीं करते हैं, लेकिन आप उन लक्षणों को बना सकते हैं जो स्वयं अन्य लक्षणों का उपयोग करते हैं। प्रति पीएचपी पुस्तिका के रूप में:

trait Hello { 
    public function sayHello() { 
     echo 'Hello '; 
    } 
} 

trait World { 
    public function sayWorld() { 
     echo 'World!'; 
    } 
} 

trait HelloWorld { 
    use Hello, World; 
} 

class MyHelloWorld { 
    use HelloWorld; 
} 

आप विचार कर सकते हैं इस तार्किक समूहों में अपने लक्षण बनाए रखने के लिए, और कुछ प्रतिरूपकता लागू करने के लिए एक तरह से किया जाना है।

संपादित करें: कुछ टिप्पणियों को देखते हुए, मुझे लगता है कि बेस क्लास में एक विशेषता का उपयोग करने का अर्थ यह भी है कि विशेषता किसी भी वर्ग में है जो इसे बढ़ाती है, और विशेषता के कार्यों को बेस क्लास पर प्राथमिकता दी जाती है। । इसे बाल वर्ग में रखकर केवल माता-पिता/बेस क्लास के लिए योग्यता के कार्य अनुपलब्ध होंगे।

Parent > Trait > Child 

http://php.net/manual/en/language.oop5.traits.php

11

आप लक्षण कुछ हद तक विस्तार कर सकते हैं। Mrlee के उत्तर पर विस्तार, जब आप use एक विशेषता है तो आप इसकी विधियों का नाम बदल सकते हैं।

trait FrameworkTrait { 
    public function keepMe() { 
     // Framework's logic that you want to keep 
    } 

    public function replaceMe() { 
     // Framework's logic that you need to overwrite 
    } 
} 

सीधे शब्दों में, माता पिता विशेषता में खींच कुछ और करने के लिए अपने replaceMe विधि का नाम बदलने, और अपने खुद replaceMe विधि को परिभाषित:

कहते हैं, उदाहरण के लिए यदि आप एक "जनक" विशेषता है कि अपने ढांचे द्वारा परिभाषित किया गया था की है।

trait MyTrait { 
    use FrameworkTrait { 
     FrameworkTrait::replaceMe as frameworkReplaceMe; 
    } 

    public function replaceMe() { 
     // You can even call the "parent" method if you'd like: 
     $this->frameworkReplaceMe(); 

     // Your logic here 
    } 
} 

और फिर अपनी कक्षा में:

class MyClass { 
    use MyTrait; 
} 

अब इस वर्ग ऐसा कर सकते हैं की वस्तुओं:

$obj = new MyClass(); 

$obj->keepMe();    // calls "parent" trait 
$obj->replaceMe();   // calls "child" trait 
$obj->frameworkReplaceMe(); // calls "parent" trait 
संबंधित मुद्दे