查明静态类中是否存在方法更新:

2022-08-30 12:04:00

我想检查我正在创建的库中是否存在函数,该函数是静态的。我已经看到了函数和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,而无需将其从静态上下文中取出。给定用于访问类的关键字应为“self”,因为$this用于分配的类。


答案 1

static::class自 PHP 5.5 起可用,并将返回“晚期静态绑定”类名:

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() 函数,从 php 5.0.0 开始,如果在类中调用,则不需要任何参数,它将返回声明函数的类的名称(例如,父类):

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

class subClass extends myClass {}

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

__CLASS__魔术常数做同样的事情[链接]。

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

class subClass extends myClass {}

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

答案 2

更新:

啊,抱歉。我暂时失明:)您需要使用魔术常数__CLASS__

例如:

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

推荐