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

レポート:

PHPの致命的なエラー:クラスabsclassには1つの抽象メソッドが含まれているため、抽象として宣言するか、残りのメソッドを実装する必要があります(absclass :: fuc)

残りのメソッドを実装することでそれが何を意味するのか知りたいのですが、どうすればよいですか?

4

7 に答える 7

82

PHPマニュアルのクラス抽象化に関する章を参照してください。

PHP 5では、抽象クラスとメソッドが導入されています。抽象として定義されたクラスはインスタンス化できない場合があり、少なくとも1つの抽象メソッドを含むクラスも抽象である必要があります。抽象として定義されたメソッドは、メソッドのシグネチャを宣言するだけです。実装を定義することはできません。

それはあなたがしなければならないことを意味します

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
    };
}
于 2010-03-03T13:29:58.827 に答える
36

存在する可能性のある非抽象メソッドはとにかく大丈夫なので、残りのメソッドは実際には定義しようとしている抽象メソッド(この場合は)を参照していると思います。fuc()これはおそらく、より正確な表現を使用できるエラーメッセージです。残りの部分は抽象的である可能性があります。

修正は非常に簡単です(エラーメッセージのその部分は問題ありません):これを変更する必要があります:

abstract public function fuc();

...適切な実装に:

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

...または、必要に応じて、クラス全体を抽象化します。

abstract class absclass {
    abstract public function fuc();
}
于 2010-03-03T13:29:08.483 に答える
30

抽象クラスを直接インスタンス化することはできませんが、抽象メソッドと非抽象メソッドの両方を含めることができます。

抽象クラスを拡張する場合は、そのすべての抽象関数を実装するか、サブクラスを抽象にする必要があります。

通常のメソッドをオーバーライドして抽象化することはできませんが、(最終的には)すべての抽象メソッドをオーバーライドして非抽象化する必要があります。

<?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つの抽象メソッドが含まれているため、抽象として宣言するか、残りのメソッドを実装する必要があります(Dog :: bark)

BadDogクラスをコメントアウトすると、出力は次のようになります。

name: Fred
gender: female
bowowwaoar

DogまたはPassTheBuckDogを直接インスタンス化しようとすると、次のようになります。

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

..爆弾:

PHPの致命的なエラー:抽象クラスDogをインスタンス化できません

または($ wrong行をコメントアウトする場合)

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();

それはうまくいきます。

于 2011-03-29T23:58:09.603 に答える
4

このエラーメッセージに少し惑わされています。この場合、定義されているのはこのクラスfuc内にあるため、このクラスに実装することは実際には意味がありません。エラーがあなたに伝えようとしているのは、非抽象クラスは抽象メソッドを持つことができないということです。クラスの定義に抽象メソッドを入れるとすぐに、クラス自体も抽象としてマークする必要があります。

于 2010-03-03T13:19:45.743 に答える
4

抽象キーワードは、クラスまたはメソッドをパターンとしてラベル付けするために使用されます。インターフェイスに似ていますが、変数とメソッドの実装を含めることができます。

抽象クラスに関しては多くの誤解があります。これは抽象的なDogクラスの例です。開発者が他の開発者のために、または自分自身が拡張するためにいくつかの基本的なDogクラスを作成したい場合、彼はクラスを抽象として宣言します。Dogクラスを直接インスタンス化することはできません(誰もインスタンス化できません)が、独自のクラスでDogを拡張することはできます。SmartDogはDogなどを拡張します。

Dogクラスによって抽象として宣言されているすべてのメソッドは、Dogを拡張する各クラスに手動で実装する必要があります。

たとえば、抽象クラスDogには抽象メソッドDog :: Bark()があります。しかし、すべての犬は異なって吠えます。したがって、各Dogサブクラスでは、犬が吠える方法を具体的に説明する必要があるため、SmartDog :: Bark()などを定義する必要があります。

于 2011-06-23T19:35:33.187 に答える
3

これは、抽象クラスの適切なものが少なくとも1つの抽象メソッドを持っていることを意味します。したがって、クラスはメソッド(非抽象)を実装するか、抽象として宣言する必要があります。

于 2010-03-03T13:18:39.287 に答える
1

非抽象クラス(通常のクラス?)内で抽象メソッドを使用したかったのですが、次のようにget_parent_class()を使用してメソッドの内容を'if'ステートメントでラップできることがわかりました。

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()ドキュメント

于 2013-08-29T23:14:24.923 に答える