【问题标题】:Is there a way to find out if a method is static or not?有没有办法找出方法是否是静态的?
【发布时间】:2013-04-17 01:53:18
【问题描述】:

有没有办法判断一个方法是否是静态的?

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

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

【问题讨论】:

  • “php 似乎会自动创建一个 className 实例并调用该函数”——这不是真的。
  • @sectus:那为什么那些调用不会失败?
  • 使用 E_STRICT 错误级别。
  • @sectus:仍然没有报告错误。我将尝试将我的代码压缩为一个示例并发布它。
  • "调用非静态方法静态生成 E_STRICT 级别警告。" - Static Keyword

标签: php static-methods


【解决方案1】:

当我打电话给call_user_function_array($className.'::'.$functionName, $args); 并且该方法是非静态的,php似乎会自动 创建一个 className 实例并调用该函数。

不,它没有。 PHP 不是 自动的。不知道你在那里做什么。

要静态调用方法,您可以这样做:

call_user_func_array("$className::$functionName", $args);

要调用对象的方法,首先需要显式实例化一个对象,然后这样调用:

$obj = new MyClass;
call_user_func_array(array($obj, $method), $args);

要以编程方式确定方法是否为静态,请使用ReflectionClass

$r = new ReflectionClass($myClass);
$m = $r->getMethod($method);
var_dump($m->isStatic());

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

【讨论】:

  • 感谢最后的警告。相信我,我知道我在做什么......我知道这些是一些著名的遗言...... ;-)
【解决方案2】:

您可以使用反射检查方法。

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

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

【讨论】:

    【解决方案3】:

    由于反射很昂贵,我实际上最终调用了set_error_handler,并使用了一个抛出 ErrorException 的回调,如here 所述,以在对非静态方法进行静态调用时捕获警告。

    【讨论】:

    • 真的喜欢意大利面条代码,是吗?要动态调用您甚至不知道的对象上的方法,您不知道您会覆盖全局错误处理程序以捕获异常......?!对不起,但这让人难以置信。
    • 我并不是说支持或反对 PHP 错误处理系统,你说得对,它并不完全好。我的意思是,您似乎会花费相当长的时间来完成一些看似可疑的做法,并且您的代码可能因此很难维护或理解。您在那里非常沉迷于元编程,这使得几乎任何语言都难以理解,而且您使用的语言实际上并不完全适合元编程。
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    相关资源
    最近更新 更多