6

わかりましたので、これについてここで多くの投稿を読みましたが、これは具体的で新しい質問だと思います.

ここにいる私たちの多くが間違って「抽象静的メソッド」と呼んでいるものの機能が必要です。つまり、それを拡張するクラスが特定の静的メソッドを実装することを主張するクラスが必要です

抽象静的を許可しないというよく議論されている問題を回避する方法は 2 つあるようですが、どちらも洗練されていないように見えます。

問題

以下はエラーを生成します: "PHP Strict Standards: Static function A::fn() should not be abstract".

<?php
abstract class A
{
     abstract static public function fn();
}

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

解決策 1: インターフェイスを使用する

<?php
interface iA {
    static function fn();
}


abstract class A implements iA 
{
} // obviously this would have other stuff in it in reality

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

これに関する問題は、インターフェイスがすべてのメソッドがパブリックであると想定 (指示) していることです。したがって、これは抽象クラスのサブクラスが特定の静的メソッドを持つことを主張するという目標を達成しますが、パブリック メソッドに対してのみ使用できます。A のサブクラスが保護された静的メソッドを実装することを保証する方法はまだありません。

保護された静的メソッドは、メソッドが完全に静的データに対して機能するが、「外部」から呼び出すべきではない場合に役立ちます。

解決策 2: 例外

abstract class A
{
     static public function fn()
     {  
         throw new Exception(get_called_class() . " must implement fn()");
     }

}

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

fn() が呼び出された場合、これは実行時に機能します。しかし、実行時にコーディング構文の間違いに対処しなければならないのは役に立ちません。これは 1 つのメソッドのハックかもしれませんが、メソッドごとにさらに多くのコードが必要になります。

この設計には、言語が正しく禁止するほど間違っているものがありますか? サブクラスがほとんどのタイプのメソッドを提供することを主張するさまざまな方法があるのは奇妙に思えますが、静的なものは提供しません。

4

2 に答える 2

2

これは、静的メソッドが定義されているクラスに属しているためです。A::fn()B::fn()は、継承ツリーに関係なく、2 つの異なる方法です。A::fn()したがって、として定義することはほとんど意味がありませんabstract

おそらく、問題のメソッドはまったく抽象的であってはなりませんか? 何らかの種類のポリモーフィズムを使用する場合は、関連するオブジェクトが必要です。

于 2013-02-15T12:59:17.673 に答える
0

完全に間違っているかもしれませんが、使用には問題ありません

abstract class A
{
     abstract static public function fn();
}

class B extends A
{
    static public function fn()
    {
         print 1;
    }
}

B::fn();

出力として 1 を生成します。ここでコードを実行しました。どのバージョンの php を使用していますか?

于 2013-02-15T12:46:01.957 に答える