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


class absclass {
    abstract public function fuc();
}

रिपोर्ट:

PHP घातक त्रुटि: कक्षा absclass   1 सार विधि है और जरूरी है   इसलिए अमूर्त घोषित किया जाना चाहिए या   शेष विधियों को लागू करें   (Absclass :: fuc)

मैं जानना चाहता हूं कि इसका क्या अर्थ है शेष विधियों को लागू करें,किस तरह?


44
2018-03-03 13:16


मूल


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


जवाब:


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

फिक्स बहुत सरल है (त्रुटि संदेश का वह हिस्सा ठीक है): आपको इसे बदलने की आवश्यकता है:

abstract public function fuc();

... एक उचित कार्यान्वयन में:

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

... या, वैकल्पिक रूप से और आपकी जरूरतों के आधार पर, संपूर्ण वर्ग सार बनाएं:

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

23
2018-03-03 13:29



मैं सहमत हूं गलत संदेश त्रुटि संदेश - user198729
यह संभवतः उत्तर कैसे है? इस मामले में "शेष विधियां" को "फ्यूक" से संदर्भित किया गया है, क्योंकि त्रुटि संदेश कहता है, क्योंकि आपने इसे अमूर्त घोषित कर दिया है लेकिन वर्ग को स्वयं ही सार घोषित नहीं किया है। त्रुटि संदेश पूरी तरह से शब्द लगता है। - Robert Grant
@RobertGrant - अगर संदेश पूरी तरह से शब्द दिया गया था, तो इस सवाल को पहले स्थान पर नहीं पूछा गया होगा। - SDC
हेहे ... त्रुटि संदेश है गन्दा, ऊपर रॉबर्ट का तर्क है (चूंकि इस मामले में 'शेष विधियों "को संदर्भित किया गया है, इसलिए" फ्यूक "का मतलब है कि त्रुटि क्यों है। msgstr उलझन में है ...), लेकिन वह अभी भी ठीक है: स्वीकार्य उत्तर प्रश्न का उत्तर नहीं देता है। :) क्या यह "परिपत्र गलतफहमी" का एक अच्छा मामला है, जहां फर्जी उत्तर बोगस नहीं हल करता है (यहाँ देखें क्यों) सवाल, लेकिन वास्तव में पूछताछ की वास्तविक समस्या वास्तव में, लेकिन गलत तरीके से व्यक्त की गई थी?) - Sz.
@ गॉर्डन का जवाब सही जवाब है .. - musicliftsme


अध्याय देखें PHP मैनुअल में कक्षा सार तत्व:

पीएचपी 5 ने एबस्ट्रेक्ट श्रेणियों और विधियों की शुरुआत की। सार के रूप में परिभाषित वर्गों को तत्काल नहीं किया जा सकता है, और कम से कम एक अमूर्त विधि वाले किसी वर्ग में भी सार होना चाहिए। सार के रूप में परिभाषित तरीके बस विधि के हस्ताक्षर की घोषणा करते हैं - वे कार्यान्वयन को परिभाषित नहीं कर सकते हैं।

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

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
    };
}

73
2018-03-03 13:29



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


एक अमूर्त वर्ग को तुरंत चालू नहीं किया जा सकता है, लेकिन इसमें अमूर्त और गैर-सार दोनों विधियां हो सकती हैं।

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

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

<?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 घातक त्रुटि: कक्षा BadDog   1 सार विधि है और जरूरी है   इसलिए अमूर्त घोषित किया जाना चाहिए या   शेष विधियों को लागू करें   (कुत्ते का भौंकना)

यदि आप BadDog क्लास को टिप्पणी करते हैं, तो आउटपुट है:

name: Fred
gender: female
bowowwaoar

यदि आप सीधे कुत्ते या PassTheBuckDog को तुरंत चालू करने का प्रयास करते हैं, तो इस तरह:

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

.. के साथ बम:

PHP घातक त्रुटि: तत्काल नहीं कर सकता   अमूर्त वर्ग कुत्ता

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

PHP घातक त्रुटि: तत्काल नहीं कर सकता   अमूर्त वर्ग 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();

यह ठीक काम करता है।


25
2018-06-23 19:35



public public function bark() ? - Raptor
ओह, यह इंगित करने के लिए धन्यवाद। संपादित और तय। - Shavais


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

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

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

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


3
2018-03-03 13:18





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


2
2018-03-03 13:19





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


2
2017-08-29 23:14





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

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

या, कार्रवाई में (cmd लाइन पर फ़ाइल में परीक्षण किया गया: php -f "abstract_method_normal_class_test.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 () दस्तावेज़ीकरण


0