web-dev-qa-db-ja.com

メソッドが静的クラスに存在するかどうかを確認する

確認したいのは、作成中のライブラリに静的な関数が存在するかどうかです。 functionとmethod_existsを見てきましたが、相対コンテキストでそれらを呼び出すことができる方法を見つけていません。これはより良い例です:

class myClass{
    function test1()
    {
        if(method_exists("myClass", "test1"))
        {
            echo "Hi";
        }
    }
    function test2()
    {
        if(method_exists($this, "test2"))
        {
            echo "Hi";
        }
    }
    function test3()
    {
        if(method_exists(self, "test3"))
        {
            echo "Hi";
        }
    }
}
// Echos Hi
myClass::test1();
// Trys to use 'self' as a string instead of a constant
myClass::test3();
// Echos Hi
$obj = new myClass;
$obj->test2();

関数が存在する場合、静的コンテキストからそれを取り出す必要なしに、テスト3をエコーHiにできる必要があります。 $ thisは割り当てられたクラス用であるため、クラスにアクセスするためのキーワードが 'self'である必要があります。

36
Tyler Carter

_static::class_はPHP 5.5以降で使用可能であり、 " Late Static Binding "クラス名を返します:

_class myClass {
    public static function test()
    {
        echo static::class.'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // should print "subClass::test()"
_

get_called_class() は同じことを行い、PHP 5.3で導入されました

_class myClass {
    public static function test()
    {
        echo get_called_class().'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // should print "subClass::test()"
_

get_class() 関数。php5.0.0以降、クラス内で呼び出された場合、パラメータは不要であり、関数が宣言されたクラスの名前を返します(例:親クラス):

_class myClass {
    public static function test()
    {
        echo get_class().'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"
_

___CLASS___マジック定数 は同じ[ link ]を実行します。

_class myClass {
    public static function test()
    {
        echo __CLASS__.'::test()';
    }
}

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"
_
56
gapple

更新:

ああ、お詫び。私は一時的に盲目でした:)あなたは魔法の定数__CLASS__を使いたいでしょう

例えば.

if (method_exists(__CLASS__, "test3")) { echo "Hi"; }
3
hobodave