找出一个方法在静态类存在(Find out if a method exists in a stat

2019-06-26 10:13发布

我要检查是在我创建一个库,它是静态的功能存在。 我见过的功能和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回声嗨,如果函数存在,而不需要将其取出静态文本。 鉴于关键字来访问类应该是“自我”,因为$这是指定的类。

Answer 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()"


Answer 2:

更新:

啊,道歉。 我暂时失明:)你想使用魔法不断__CLASS__

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


Answer 3:

适用于所有情况...最好的用法是...

if method_exist(…) && is_callable(…)

用于测试示例:

class Foo {
  public function PublicMethod() {}
  private function PrivateMethod() {}
  public static function PublicStaticMethod() {}
  private static function PrivateStaticMethod() {}
}

$foo = new Foo();

$callbacks = array(
  array($foo, 'PublicMethod'),
  array($foo, 'PrivateMethod'),
  array($foo, 'PublicStaticMethod'),
  array($foo, 'PrivateStaticMethod'),
  array('Foo', 'PublicMethod'),
  array('Foo', 'PrivateMethod'),
  array('Foo', 'PublicStaticMethod'),
  array('Foo', 'PrivateStaticMethod'),
);

foreach ($callbacks as $callback) {
  var_dump($callback);
  var_dump(method_exists($callback[0], $callback[1])); // 0: object / class name, 1: method name
  var_dump(is_callable($callback));
  echo str_repeat('-', 40), "n";
}

来源这里



文章来源: Find out if a method exists in a static class