PHP में एक सार वर्ग क्या है?


121

PHP में एक सार वर्ग क्या है?

इसका उपयोग कैसे किया जा सकता है?




6
@ बोर्डन: कभी-कभी आधिकारिक डॉक्स कुछ लोगों के लिए स्पष्ट नहीं होते हैं :(
सरफराज


3
@ सरफराज जो आरटीएफएम तरीके से नहीं है। मैं सिर्फ यह सोचता हूं कि आधिकारिक दस्तावेज का लिंक एक सहायक संपत्ति है। और आप विश्वास नहीं करेंगे कि कितने लोग आधिकारिक डॉक्स नहीं पढ़ते हैं या यहां तक ​​कि जानते हैं कि वे मौजूद हैं।
गॉर्डन

जवाबों:


131

एक अमूर्त वर्ग एक ऐसा वर्ग होता है जिसमें कम से कम एक अमूर्त विधि होती है, जो कि किसी भी वास्तविक कोड के बिना एक विधि है, बस नाम और पैरामीटर, और जिसे "अमूर्त" के रूप में चिह्नित किया गया है।

इसका उद्देश्य विरासत से एक तरह का खाका प्रदान करना है और अमूर्त तरीकों को लागू करने के लिए विरासत वाले वर्ग को मजबूर करना है।

एक सार वर्ग इस प्रकार एक नियमित वर्ग और एक शुद्ध इंटरफ़ेस के बीच कुछ है। इसके अलावा इंटरफेस अमूर्त वर्गों का एक विशेष मामला है जहां सभी तरीके सार हैं।

आगे के संदर्भ के लिए PHP मैनुअल के इस भाग को देखें ।


6
में इस सूत्र , सार किसी भी सार विधि शामिल नहीं है।
21:00 बजे 21

6
@ r0ng यह कहना अधिक सही होगा कि एक अमूर्त वर्ग में अमूर्त विधियाँ हो सकती हैं, और अमूर्त विधियाँ हमेशा एक अमूर्त वर्ग के अंदर होनी चाहिए। मेरे दिमाग में परिभाषित व्यावहारिक विशेषताएं यह हैं कि एक अमूर्त वर्ग को त्वरित नहीं किया जा सकता है, लेकिन आप इनहेरिट कर सकते हैं और तरीकों को अधिलेखित कर सकते हैं, और एक अमूर्त वर्ग से स्थिर तरीकों का सामान्य रूप से उपयोग किया जा सकता है।
okdewit

117

अमूर्त कक्षाएं वे कक्षाएं होती हैं जिनमें एक या एक से अधिक सार विधियां होती हैं। एक अमूर्त विधि एक विधि है जिसे घोषित किया जाता है, लेकिन इसमें कोई कार्यान्वयन नहीं होता है। अमूर्त वर्गों को तत्काल नहीं किया जा सकता है, और सार विधियों के लिए कार्यान्वयन प्रदान करने के लिए उपवर्गों की आवश्यकता होती है।

1. अमूर्त वर्ग को तात्कालिक नहीं किया जा सकता है: सार के रूप में परिभाषित वर्गों को तत्काल नहीं किया जा सकता है, और किसी भी वर्ग में कम से कम एक अमूर्त विधि शामिल है जो भी सार होना चाहिए।

नीचे उदाहरण:

abstract class AbstractClass
{

    abstract protected function getValue();
    abstract protected function prefixValue($prefix);


    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new AbstractClass();
$obj->printOut();
//Fatal error: Cannot instantiate abstract class AbstractClass

2. कोई भी वर्ग जिसमें कम से कम एक अमूर्त विधि हो, वह भी सार होना चाहिए : एब्सट्रैक्ट क्लास में अमूर्त और गैर-अमूर्त विधियां हो सकती हैं, लेकिन इसमें कम से कम एक अमूर्त विधि होनी चाहिए। यदि किसी वर्ग में कम से कम एक सार पद्धति है, तो कक्षा को सार घोषित किया जाना चाहिए।

नोट: प्रदर्शित कक्षा में आवश्यकताओं को लागू करने के लिए लक्षण सार विधियों के उपयोग का समर्थन करते हैं।

नीचे उदाहरण:

class Non_Abstract_Class
{
   abstract protected function getValue();

    public function printOut() {
        echo "Hello how are you?";
    }
}

$obj=new Non_Abstract_Class();
$obj->printOut();
//Fatal error: Class Non_Abstract_Class contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Non_Abstract_Class::getValue)

3. एक अमूर्त विधि में शरीर शामिल नहीं हो सकता है : अमूर्त के रूप में परिभाषित तरीके केवल विधि के हस्ताक्षर की घोषणा करते हैं - वे कार्यान्वयन को परिभाषित नहीं कर सकते हैं। लेकिन एक गैर-अमूर्त विधि कार्यान्वयन को परिभाषित कर सकती है।

abstract class AbstractClass
{
   abstract protected function getValue(){
   return "Hello how are you?";
   }

    public function printOut() {
        echo $this->getValue() . "\n";
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."\n";
//Fatal error: Abstract function AbstractClass::getValue() cannot contain body

4. जब एक अमूर्त वर्ग से विरासत में मिला है, तो माता-पिता की कक्षा की घोषणा में अमूर्त के रूप में चिह्नित सभी तरीकों को बच्चे द्वारा परिभाषित किया जाना चाहिए : यदि आप एक सार वर्ग को प्राप्त करते हैं, तो आपको इसमें सभी अमूर्त विधियों को कार्यान्वयन प्रदान करना होगा।

abstract class AbstractClass
{
    // Force Extending class to define this method
    abstract protected function getValue();

    // Common method
    public function printOut() {
        print $this->getValue() . "<br/>";
    }
}

class ConcreteClass1 extends AbstractClass
{
    public function printOut() {
        echo "dhairya";
    }

}
$class1 = new ConcreteClass1;
$class1->printOut();
//Fatal error: Class ConcreteClass1 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractClass::getValue)

5. एक ही (या एक कम प्रतिबंधित) दृश्यता : जब एक अमूर्त वर्ग से विरासत में मिला, तो माता-पिता की कक्षा की घोषणा में सार के सभी तरीकों को बच्चे द्वारा परिभाषित किया जाना चाहिए; इसके अतिरिक्त, इन विधियों को समान (या कम प्रतिबंधित) दृश्यता के साथ परिभाषित किया जाना चाहिए। उदाहरण के लिए, यदि सार पद्धति को संरक्षित के रूप में परिभाषित किया गया है, तो फ़ंक्शन कार्यान्वयन को संरक्षित या सार्वजनिक रूप से परिभाषित किया जाना चाहिए, लेकिन निजी नहीं।

ध्यान दें कि अमूर्त विधि निजी नहीं होनी चाहिए।

abstract class AbstractClass
{

    abstract public function getValue();
    abstract protected function prefixValue($prefix);

        public function printOut() {
        print $this->getValue();
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}
$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') ."<br/>";
//Fatal error: Access level to ConcreteClass1::getValue() must be public (as in class AbstractClass)

6. अमूर्त विधियों के हस्ताक्षर मेल खाना चाहिए : जब एक अमूर्त वर्ग से विरासत में मिला है, तो माता-पिता की कक्षा घोषणा में अमूर्त के रूप में चिह्नित सभी तरीकों को बच्चे द्वारा परिभाषित किया जाना चाहिए; विधियों के हस्ताक्षर मेल खाने चाहिए, अर्थात प्रकार संकेत और आवश्यक संख्या। तर्क समान होने चाहिए। उदाहरण के लिए, यदि बच्चा वर्ग एक वैकल्पिक तर्क को परिभाषित करता है, जहां अमूर्त पद्धति के हस्ताक्षर नहीं हैं, तो हस्ताक्षर में कोई संघर्ष नहीं है।

abstract class AbstractClass
{

    abstract protected function prefixName($name);

}

class ConcreteClass extends AbstractClass
{


    public function prefixName($name, $separator = ".") {
        if ($name == "Pacman") {
            $prefix = "Mr";
        } elseif ($name == "Pacwoman") {
            $prefix = "Mrs";
        } else {
            $prefix = "";
        }
        return "{$prefix}{$separator} {$name}";
    }
}

$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "<br/>";
echo $class->prefixName("Pacwoman"), "<br/>";
//output: Mr. Pacman
//        Mrs. Pacwoman

7. सार वर्ग एकाधिक वंशानुक्रम का समर्थन नहीं करता है : सार वर्ग एक अन्य सार वर्ग का विस्तार कर सकता है, सार वर्ग इंटरफ़ेस के कार्यान्वयन को प्रदान कर सकता है। लेकिन यह कई विरासत का समर्थन नहीं करता है।

interface MyInterface{
    public function foo();
    public function bar();
}

abstract class MyAbstract1{
    abstract public function baz();
}


abstract class MyAbstract2 extends MyAbstract1 implements MyInterface{
    public function foo(){ echo "foo"; }
    public function bar(){ echo "bar"; }
    public function baz(){ echo "baz"; }
}

class MyClass extends MyAbstract2{
}

$obj=new MyClass;
$obj->foo();
$obj->bar();
$obj->baz();
//output: foobarbaz

नोट: कृपया अपने कोड में वर्गों के आदेश या स्थिति की व्याख्या करें दुभाषिया को प्रभावित कर सकता है और एक घातक त्रुटि पैदा कर सकता है। इसलिए, अमूर्त के कई स्तरों का उपयोग करते समय, स्रोत कोड के भीतर कक्षाओं की स्थिति से सावधान रहें।

नीचे दिए गए उदाहरण के कारण घातक त्रुटि होगी : कक्षा 'घोड़ा' नहीं मिला

class cart extends horse {
    public function get_breed() { return "Wood"; }
}

abstract class horse extends animal {
    public function get_breed() { return "Jersey"; }
}

abstract class animal {
    public abstract function get_breed();
}

$cart = new cart();
print($cart->get_breed());

1
अच्छी तरह से विस्तृत।
Talk2Nit

18

एक अमूर्त वर्ग एक ऐसा वर्ग है जो केवल प्रोग्रामर द्वारा आंशिक रूप से लागू किया जाता है। इसमें एक या अधिक सार विधियाँ हो सकती हैं। एक अमूर्त विधि केवल एक फ़ंक्शन परिभाषा है जो प्रोग्रामर को यह बताने के लिए कार्य करती है कि विधि को एक बच्चे की कक्षा में लागू किया जाना चाहिए।

यहाँ उस की अच्छी व्याख्या है


नमस्ते, स्पष्टीकरण के लिए धन्यवाद, सच्चाई यह है कि इंटरनेट पर पीएचपी में सार और इंटरफ़ेस के बारे में ऐसी कोई अच्छी व्याख्या नहीं है।
लेनिन ज़पाटा

12

अमूर्त वर्ग
1. एक अमूर्त विधि सम्‍मिलित है
2. सीधे आरंभीकृत नहीं की जा
सकती

सार विधि
1. किसी निकाय को शामिल
नहीं किया जा सकता। 2. निजी के रूप में परिभाषित नहीं किया जा सकता है
। 3. बाल वर्गों को सार वर्ग में घोषित विधियों को परिभाषित करना चाहिए

उदाहरण कोड:

abstract class A {
    public function test1() {
        echo 'Hello World';
    }
    abstract protected function f1();
    abstract public function f2();
    protected function test2(){
        echo 'Hello World test';
    }
}

class B extends A {
    public $a = 'India';
    public function f1() {
        echo "F1 Method Call";
    }
    public function f2() {
        echo "F2 Method Call";
    }
}

$b = new B();
echo $b->test1() . "<br/>";
echo $b->a . "<br/>";
echo $b->test2() . "<br/>";
echo $b->f1() . "<br/>";
echo $b->f2() . "<br/>";

आउटपुट:

Hello World
India
Hello World test
F1 Method Call
F2 Method Call

आप चाइल्ड क्लास ऑब्जेक्ट द्वारा पैरेंट प्रोटेक्टेड विधि को कॉल नहीं कर सकते हैं, आप इस क्लास द्वारा चाइल्ड क्लास मेथड में कॉल कर सकते हैं $ b-> test2 (!)। "<br/>";
अल-अमीन

7
  • अमूर्त वर्ग में केवल विधि के हस्ताक्षर की घोषणा होती है, वे कार्यान्वयन को परिभाषित नहीं कर सकते हैं।
  • अमूर्त वर्ग को कीवर्ड सार का उपयोग करके परिभाषित किया गया है ।
  • सार वर्ग कई विरासत को लागू करने के लिए संभव नहीं है ।
  • PHP 5 के नवीनतम संस्करण में अमूर्त वर्ग और विधियाँ हैं।
  • सार के रूप में परिभाषित कक्षाएं, हम ऑब्जेक्ट बनाने में असमर्थ हैं (त्वरित नहीं हो सकता है)

0

अमूर्त वर्ग वे वर्ग हैं जिन्हें सीधे आरंभीकृत नहीं किया जा सकता है। या दूसरे शब्दों में हम कह सकते हैं कि अमूर्त वर्ग वे वर्ग हैं, जो वस्तु को सीधे नहीं बनाया जा सकता है। PHP अमूर्त कक्षाओं में कीवर्ड सार के साथ परिभाषित किया जाता है

साथ ही एक कक्षा का सार बनने के लिए कक्षा की एक विधि का सार होना चाहिए।

सार वर्ग के विस्तार के लिए आप PHP में Abstract Class पर मेरे ब्लॉग का उल्लेख कर सकते हैं ।


0

एक अमूर्त वर्ग सामान्य वर्ग की तरह होता है जिसमें चर होते हैं जिसमें यह संरक्षित चर कार्य होते हैं जिसमें रचनाकार होता है केवल एक चीज अलग होती है जिसमें यह सार पद्धति होती है।

अमूर्त विधि का अर्थ है परिभाषा के बिना एक खाली विधि ताकि अमूर्त वर्ग में केवल एक अंतर हम अमूर्त वर्ग की एक वस्तु नहीं बना सकते

अमूर्त में अमूर्त विधि शामिल होनी चाहिए और उन विधियों को इसकी विरासत वर्ग में परिभाषित किया जाना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.