2009-07-20 33 views
29

我想检查一个函数存在于我创建的库中,它是静态的。我见过函数和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回声嗨,如果函数存在,而不需要将其取出静态文本。鉴于用于访问类的关键字应该是'self',因为$用于分配的类。

+0

为什么test1()方法不够? – gapple 2009-07-21 00:19:06

+0

因为我想把它放到一个将被多个类扩展的类中。我可以用一个魔术常数来实现这一点,但应该有一个更简单的方法。 – 2009-07-21 00:31:53

回答

49

get_called_class()在PHP 5.3中引入,并且将返回 “后期静态绑定” 类的名字:

class myClass{ 
    public static function test() 
    { 
     if(method_exists(get_called_class(), "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() 
    { 
     if(method_exists(get_class(), "test")) 
     { 
       echo get_class().'::test()'; 
     } 
    } 
} 

class subClass extends myClass{} 

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

__CLASS__ magic constant也一样[link]。

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

class subClass extends myClass{} 

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

谢谢!那正是我所期待的。 – 2009-07-21 01:11:06

+0

我正在寻找一种方法来检查父类是否存在静态方法,这个答案让我发现'get_parent_class()'在没有任何参数的情况下调用时的工作方式相同。谢谢! – mopo922 2016-05-04 05:10:43

1

更新:

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

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

这个答案似乎与使用method_exists()的问题示例的test1()方法相同,类名称作为字符串传递 – gapple 2009-07-21 00:21:49

+0

这个想法是我不需要类名,因此我可以将该方法放入任何班级,并且它应该工作,无论班级是否已分配。 – 2009-07-21 00:27:38

+0

你的意思是说,我只是提出了主要问题? – 2009-07-21 00:35:55

相关问题