Php 有没有办法确定一个方法是否是静态的?

Php 有没有办法确定一个方法是否是静态的?,php,static-methods,Php,Static Methods,有没有办法确定一个方法是否是静态的 我需要知道的原因: 我在任何实例化上下文之外调用静态方法。非静态方法不能被调用,因为它们还没有意义。我想在这些类的实例存在之后调用它们 当我调用call_user_function_数组($className.::'。$functionName,$args)时并且该方法是非静态的,php似乎会自动创建className的实例并调用该函数。我希望非静态函数的调用失败 当我调用call_user_function_数组($className.::'。$functi

有没有办法确定一个方法是否是静态的

我需要知道的原因: 我在任何实例化上下文之外调用静态方法。非静态方法不能被调用,因为它们还没有意义。我想在这些类的实例存在之后调用它们


当我调用
call_user_function_数组($className.::'。$functionName,$args)时并且该方法是非静态的,php似乎会自动创建className的实例并调用该函数。我希望非静态函数的调用失败

当我调用
call_user_function_数组($className.::'。$functionName,$args)时
而且该方法是非静态的,php似乎可以自动
创建className的实例并调用该函数

不,没有。PHP不是automagic。不知道你在那里干什么

要静态调用方法,请执行以下操作:

call_user_func_array("$className::$functionName", $args);
要调用对象的方法,首先需要显式实例化对象,然后按如下方式调用:

$obj = new MyClass;
call_user_func_array(array($obj, $method), $args);
要以编程方式确定方法是否为静态方法,请使用:

但是,在调用方法之前,您应该真正了解它是什么,而不是动态地尝试找出它

当我调用
call_user_function_数组($className.::'。$functionName,$args)时
而且该方法是非静态的,php似乎可以自动
创建className的实例并调用该函数

不,没有。PHP不是automagic。不知道你在那里干什么

要静态调用方法,请执行以下操作:

call_user_func_array("$className::$functionName", $args);
要调用对象的方法,首先需要显式实例化对象,然后按如下方式调用:

$obj = new MyClass;
call_user_func_array(array($obj, $method), $args);
要以编程方式确定方法是否为静态方法,请使用:


不过,在调用方法之前,您应该真正了解它是什么,而不是动态地尝试找出它。

您可以使用反射检查方法

class foo
    {
    static public function bar()
        {}

    public function baz()
        {}
    }

$reflection_class = new ReflectionClass('foo');

var_dump($reflection_class->getMethod('bar')->isStatic()); // boolean true
var_dump($reflection_class->getMethod('baz')->isStatic()); // boolean false

另外,你试图调用方法但却不知道它们到底是什么,这很奇怪。

你可以通过反射来检查方法

class foo
    {
    static public function bar()
        {}

    public function baz()
        {}
    }

$reflection_class = new ReflectionClass('foo');

var_dump($reflection_class->getMethod('bar')->isStatic()); // boolean true
var_dump($reflection_class->getMethod('baz')->isStatic()); // boolean false

另外,你试图调用方法却不知道它们到底是什么,这很奇怪。

因为反射很昂贵,我实际上最终调用了
set\u error\u handler
,回调抛出了一个ErrorException,如前所述,以在静态调用非静态方法时捕捉警告。

因为反射非常昂贵,我实际上最终调用了
set\u error\u handler
,并使用一个回调抛出一个ErrorException,如前所述,用于在对非静态方法进行静态调用时捕获警告。

“php似乎会自动创建className的实例并调用该函数”-这不是真的。@sectus:为什么这些调用不会失败?使用E_严格的错误级别。@sectus:stil没有报告错误。我将尝试将我的代码浓缩为一个示例并发布它。“静态调用非静态方法会生成E_STRICT级别的警告。”——“php似乎会自动创建className的实例并调用该函数”-这不是真的。@sectus:为什么这些调用不会失败?使用E_严格的错误级别。@sectus:stil没有报告错误。我将尝试将我的代码浓缩成一个示例并发布它。“静态调用非静态方法会生成一个E_严格级别的警告。”-谢谢最后的警告。相信我,我知道我在做什么。。。我知道这是一些著名的遗言……;-)谢谢你最后的警告。相信我,我知道我在做什么。。。我知道这是一些著名的遗言……;-)你真的喜欢意大利面代码,是吗?要动态调用您甚至不知道的对象上的方法,您不知道如何覆盖全局错误处理程序以捕获异常。。。?!抱歉,但这让人难以置信。我不是说支持或反对PHP错误处理系统,你是对的,它不太好。我的意思是,您似乎要花相当长的时间来完成一些看似可疑的实践,并且您的代码可能会因此而很难维护或理解。你非常沉迷于元编程,这使得几乎任何语言都很难理解,而且你所用的语言一开始就不太适合元编程。你真的很喜欢意大利面代码,是吗?要动态调用您甚至不知道的对象上的方法,您不知道如何覆盖全局错误处理程序以捕获异常。。。?!抱歉,但这让人难以置信。我不是说支持或反对PHP错误处理系统,你是对的,它不太好。我的意思是,您似乎要花相当长的时间来完成一些看似可疑的实践,并且您的代码可能会因此而很难维护或理解。你非常沉迷于元编程,这使得几乎任何语言都很难理解,而且你所用的语言一开始就不太适合元编程。