2010-03-03 8 views
41
class absclass { 
    abstract public function fuc(); 
} 

रिपोर्ट:PHP में गैर-सारणी कक्षा में अमूर्त विधि कैसे घोषित करें?

PHP Fatal error: Class absclass contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (absclass::fuc)

मैं जानना चाहता द्वारा इसका क्या मतलब शेष तरीकों को लागू करना चाहते हैं, तो कैसे?

+0

यह पहले से ही सार पूर्वज वर्ग में घोषित किया गया था आप inher से लागू लेकिन लागू नहीं किया गया। अब आपको इसे लागू करने की आवश्यकता है, घोषणा न करें। एक बार सभी सार (कार्यान्वयन के बिना घोषित) विधियों को लागू किया जाता है, कक्षा सार नहीं बनती है और उदाहरण हो सकते हैं। – Gherman

उत्तर

22

मुझे लगता है कि शेष तरीकों वास्तव में, सार तरीकों आप (इस मामले, fuc() में) को परिभाषित करने की कोशिश कर रहे को संदर्भित करता है के बाद से गैर सार तरीकों है कि मौजूद हो सकता है वैसे भी ठीक हैं। यह शायद एक त्रुटि संदेश है जो एक बेहतर शब्द का उपयोग कर सकता है: जहां यह कहता है शेष यह अमूर्त कहना चाहिए।

ठीक सुंदर (त्रुटि संदेश का वह हिस्सा ठीक है) स्पष्ट है: ...

abstract public function fuc(); 

एक उचित कार्यान्वयन में: आप इस बदलने की जरूरत है

public function fuc(){ 
    // Code comes here 
} 

.. ।

abstract class absclass { 
    abstract public function fuc(); 
} 
+2

मैं ** misworded त्रुटि संदेश ** – user198729

+21

से सहमत कैसे यह संभवतः जवाब है? इस मामले में "शेष विधियां" को "फ्यूक" से संदर्भित किया गया है, क्योंकि त्रुटि संदेश कहता है, क्योंकि आपने इसे अमूर्त घोषित कर दिया है लेकिन वर्ग को स्वयं ही सार घोषित नहीं किया है। त्रुटि संदेश पूरी तरह से शब्द लगता है। –

+4

@RobertGrant - अगर संदेश पूरी तरह से शब्द दिया गया था, तो इस सवाल को पहले स्थान पर नहीं पूछा गया होगा। – SDC

2

इसका मतलब है कि एक अमूर्त वर्ग के उचित में कम से कम एक सार विधि है। तो आपकी कक्षा या तो विधि (गैर सार) लागू करने के लिए, या अमूर्त घोषित करने के लिए है।

2

आप इस त्रुटि संदेश से थोड़ा सा भटक रहे हैं। इस मामले में, चूंकि यह के भीतर है इस वर्ग कि fuc परिभाषित किया जा रहा है, यह वास्तव में इस वर्ग में इसे लागू करने के लिए समझ में नहीं आता है। त्रुटि आपको यह बताने की कोशिश कर रही है कि एक गैर-सारणी वर्ग में सार तत्व नहीं हो सकते हैं। जैसे ही आप कक्षा की परिभाषा में एक अमूर्त विधि डालते हैं, आपको कक्षा को स्वयं को सार के रूप में चिह्नित करना होगा।

71

पर अध्याय देखें: या, वैकल्पिक और अपनी आवश्यकताओं निर्भर करता है, पूरी कक्षा सार बनाने:

PHP 5 introduces abstract classes and methods. Classes defined as abstract may not be instantiated, and any class that contains at least one abstract method must also be abstract. Methods defined as abstract simply declare the method's signature - they cannot define the implementation.

इसका मतलब है कि आप या तो

abstract class absclass { // mark the entire class as abstract 
    abstract public function fuc(); 
} 

या

class absclass { 
    public function fuc() { // implement the method body 
     // which means it won't be abstract anymore 
    }; 
} 
+1

क्या "कोई वर्ग जिसमें कम से कम एक अमूर्त विधि है, वह भी असाधारण होना चाहिए" PHP या ओओ भाषाओं में काफी आम है? – Caltor

+0

यह एफ # में उदाहरण के लिए – broch

25

एक सार वर्ग सीधे instantiated नहीं किया जा सकता है, लेकिन यह दोनों सार और गैर सार तरीकों हो सकते हैं।

यदि आप एक अमूर्त वर्ग का विस्तार करते हैं, तो आपको या तो अपने सभी अमूर्त कार्यों को लागू करना होगा, या उप-वर्ग सार बनाना होगा।

आप एक नियमित विधि को ओवरराइड नहीं कर सकते हैं और इसे सार बना सकते हैं, लेकिन आपको (अंततः) सभी अमूर्त तरीकों को ओवरराइड करना होगा और उन्हें गैर-सारणी बनाना होगा।

<?php 

abstract class Dog { 

    private $name = null; 
    private $gender = null; 

    public function __construct($name, $gender) { 
     $this->name = $name; 
     $this->gender = $gender; 
    } 

    public function getName() {return $this->name;} 
    public function setName($name) {$this->name = $name;} 
    public function getGender() {return $this->gender;} 
    public function setGender($gender) {$this->gender = $gender;} 

    abstract public function bark(); 

} 

// non-abstract class inheritting from an abstract class - this one has to implement all inherited abstract methods. 
class Daschund extends Dog { 
    public function bark() { 
     print "bowowwaoar" . PHP_EOL; 
    } 
} 

// this class causes a compilation error, because it fails to implement bark(). 
class BadDog extends Dog { 
    // boom! where's bark() ? 
} 

// this one succeeds in compiling, 
// it's passing the buck of implementing it's inheritted abstract methods on to sub classes. 
abstract class PassTheBuckDog extends Dog { 
    // no boom. only non-abstract subclasses have to bark(). 
} 

$dog = new Daschund('Fred', 'male'); 
$dog->setGender('female'); 

print "name: " . $dog->getName() . PHP_EOL; 
print "gender: ". $dog->getGender() . PHP_EOL; 

$dog->bark(); 

?> 

कि साथ कार्यक्रम बम:

PHP Fatal error: Class BadDog contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Dog::bark)

आप BadDog वर्ग बाहर टिप्पणी है, तो उत्पादन होता है:

name: Fred 
gender: female 
bowowwaoar 

आप एक कुत्ता या सीधे एक PassTheBuckDog का दृष्टांत करने का प्रयास करें , इस तरह:

$wrong = new Dog('somma','it'); 
$bad = new PassTheBuckDog('phamous','monster'); 

..it बम के साथ:

PHP Fatal error: Cannot instantiate abstract class Dog

या (यदि आप $ गलत लाइन बाहर टिप्पणी)

PHP Fatal error: Cannot instantiate abstract class PassTheBuckDog

हालांकि, आप एक अमूर्त वर्ग के एक स्थिर समारोह कॉल कर सकते हैं:

abstract class Dog { 
    .. 
    public static function getBarker($classname, $name, $gender) { 
     return new $classname($name, $gender); 
    } 
    .. 
} 

.. 

$other_dog = Dog::getBarker('Daschund', 'Wilma', 'female'); 
$other_dog->bark(); 

कि बस ठीक काम करता है।

+0

'सार्वजनिक सार्वजनिक समारोह छाल() 'है? – Raptor

+0

ओह, इसे इंगित करने के लिए धन्यवाद। संपादित और तय। – Shavais

3

सार कीवर्ड लेबल वर्ग या पैटर्न के रूप में तरीकों किया जाता है। यह इंटरफेस के समान है लेकिन विधियों के चर और कार्यान्वयन हो सकता है।

सार वर्गों के विषय में गलतफहमी की एक बहुत कुछ कर रहे हैं। यहां एक अमूर्त कुत्ते वर्ग का एक उदाहरण दिया गया है। यदि कोई डेवलपर अन्य डेवलपर्स के लिए कुछ बुनियादी कुत्ता वर्ग बनाना चाहता है या खुद को विस्तारित करना चाहता है तो वह कक्षा को सार के रूप में घोषित करता है। आप सीधे कुत्ते वर्ग को तुरंत नहीं कर सकते (कोई भी नहीं कर सकता), लेकिन आप कुत्ते को अपनी कक्षा से बढ़ा सकते हैं। SmartDog फैली कुत्ता आदि

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

उदाहरण के लिए, अमूर्त वर्ग कुत्ता एक सार विधि कुत्ता है :: बार्क। लेकिन सभी कुत्ते अलग छाल। तो प्रत्येक कुत्ते-उप-वर्गों में आपको यह वर्णन करना होगा कि कुत्ता कर्कश ढंग से छालता है, इसलिए आपको स्मार्टडॉग :: बार्क() को परिभाषित करना होगा।

0

मैं (? सामान्य वर्ग) एक गैर सार वर्ग के भीतर एक सार विधि का उपयोग करना चाहता था और पाया कि मैं में विधि की सामग्री को लपेट सकता है एक 'अगर' तो जैसे get_parent_class साथ बयान():

if (get_parent_class($this) !== false) { 

या, कार्रवाई में (cmd लाइन पर एक फ़ाइल में परीक्षण किया: -f "abstract_method_normal_class_test.php" php):

<?php 
    class dad { 
     function dad() { 
      if (get_parent_class($this) !== false) { 
       // implements some logic 
       echo "I'm " , get_class($this) , "\n"; 
      } else { 
       echo "I'm " , get_class($this) , "\n"; 
      } 
     } 
    } 

    class child extends dad { 
     function child() { 
      parent::dad(); 
     } 
    } 

    $foo = new dad(); 
    $bar = new child(); 
?> 

Output: 
I'm dad 
I'm child 

PHP get_parent_class() Documentation

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