将call_user_func与method_exists一起使用

时间:2016-09-02 06:37:42

标签: php

尝试在使用call_user_func注册的方法上调用method_exists。

<?php 

class stdClass1
{
    public static $methods = [];

    public function __call($method, $arguments) {
        return call_user_func_array(Closure::bind(self::$methods[$method], $this, get_called_class()), $arguments);
    }

    public function __set($name, $value) {
        if (is_callable($value)) {
            self::$methods[$name] = $value;
        } else {
            parent::__set($name, $value);
        }
    }

}

class stdClass2
{
    function stdRunMethod()
    {
        $obj = new stdClass1();
        $obj->test = function () {
            echo 'a simple function'.PHP_EOL;
        };
        var_dump(method_exists($obj, "test"));
    }
}
$obj = new stdClass2();
$obj->stdRunMethod();

method_exists返回false。如何使用method_exists检查此方法?为什么method_exists返回false?

1 个答案:

答案 0 :(得分:1)

因为def myMethod[T <: MyClass : ClassTag]: T = implicitly[ClassTag[T]].runtimeClass.newInstance().asInstanceOf[T] println(myMethod[MySubclassA]) // MySubclassA@66d2e7d9 println(myMethod[MySubclassB]) // MySubclassB@1efbd816 不是方法。这是一个存储匿名函数的属性。

如果要检查属性的值是否可以作为函数调用,可以使用test

is_callable