51

抽象親クラスとそれを拡張する具象クラスを設定しました。親クラスが抽象関数を呼び出せないのはなぜですか?

//foo.php
<?php
    abstract class AbstractFoo{
        abstract public static function foo();
        public static function getFoo(){
            return self::foo();//line 5
        }
    }

    class ConcreteFoo extends AbstractFoo{
        public static function foo(){
            return "bar";
        }
    }

    echo ConcreteFoo::getFoo();
?>

エラー:

致命的なエラー: 5 行目のfoo.phpの抽象メソッド AbstractFoo::foo() を呼び出せません

4

3 に答える 3

86

これは正しい実装です。遅延静的バインディングを使用するには、自己ではなく静的を使用する必要があります。

abstract class AbstractFoo{
    public static function foo() {
        throw new RuntimeException("Unimplemented");
    }
    public static function getFoo(){
        return static::foo();
    }
}

class ConcreteFoo extends AbstractFoo{
    public static function foo(){
        return "bar";
    }
}

echo ConcreteFoo::getFoo();

期待される「棒」を与える。

これは実際にはポリモーフィズムではないことに注意してください。静的キーワークは、静的メソッドが呼び出されたクラスに解決されます。抽象静的メソッドを宣言すると、厳密な警告が表示されます。PHP は、子 (サブ) クラスに存在しない場合、親 (スーパー) クラスからすべての静的メソッドをコピーします。

于 2010-05-18T17:56:42.503 に答える
8

あなたはその言葉に気づきselfますか?

それはAbstractClassを指しています。したがって、ConcreteClass::foo() ではなく、AbstractClass::foo() を呼び出しています。

PHP 5.3 では最新の静的バインディングが提供されると思いますが、そのバージョンを使用していない場合、self は拡張クラスではなく、関数が配置されているクラスを参照します。

参照: http://us.php.net/manual/en/function.get-called-class.php

于 2010-05-18T17:55:41.850 に答える
0

abstractメソッドでキーワードとstaticキーワードを同時に使用できないのがルールです。

キーワードを持つメソッドはabstract、サブクラスがそれを実装する必要があることを意味します。クラスのメソッドに static を追加すると、インスタンス化せずにメソッドを使用できます。

そのため、エラーが発生します。

于 2012-02-17T16:12:38.933 に答える