找出静态类中是否存在方法

Tyl*_*ter 35 php static object

我想检查一个函数是否存在于我正在创建的库中,这是静态的.我见过函数和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();
Run Code Online (Sandbox Code Playgroud)

如果函数存在,我需要能够使测试3回显Hi,而不需要将其从静态上下文中取出.鉴于访问该类的关键字应该是'self',因为$ this用于指定的类.

gap*_*ple 56

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()"
Run Code Online (Sandbox Code Playgroud)

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()"
Run Code Online (Sandbox Code Playgroud)

get_class()函数,从php 5.0.0开始,如果在类中调用,则不需要任何参数,将返回声明函数的类的名称(例如,父类):

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

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"
Run Code Online (Sandbox Code Playgroud)

__CLASS__魔术不断做同样[ 链接 ].

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

class subClass extends myClass {}

subClass::test() // prints "myClass::test()"
Run Code Online (Sandbox Code Playgroud)

  • 只需注意`static :: class`与`get_called_class()`相同,`self :: class`与`get_class()`相同,但它们仅在PHP 5.5之后可用 (2认同)

hob*_*ave 12

更新:

啊,抱歉。我暂时失明了 :) 你会想要使用魔法常量 __CLASS__

例如

if (method_exists(__CLASS__, "test3")) { echo "Hi"; }
Run Code Online (Sandbox Code Playgroud)