• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ReflectionMethod::invoke()

    (PHP 5, PHP 7)

    Invoke

    说明

    publicReflectionMethod::invoke(object $object[,mixed $parameter[,mixed$...]]) : mixed

    执行一个反射的方法。

    参数

    $object

    如果执行的方法是静态类,那么这个参数传送null。

    $parameter

    0,或者传送给方法的参数列表。可以通过这个参数,给方法传送大量的参数。

    返回值

    返回方法的返回值

    错误/异常

    如果$object并没有包含一个可以使用的类实例,那么将产生一个ReflectionException。

    如果方法调用失败,也会产生一个ReflectionException。

    范例

    Example #1ReflectionMethod::invoke()example

    <?php
    class HelloWorld {
        public function sayHelloTo($name) {
            return 'Hello ' . $name;
        }
    }
    $reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
    echo $reflectionMethod->invoke(new HelloWorld(), 'Mike');
    ?>
    

    以上例程会输出:

    Hello Mike
    

    注释

    Note:

    如果函数有参数需为引用,那么它们必须以引用方式传入。

    参见

    • ReflectionMethod::invokeArgs() 带参数执行
    • __invoke()
    • call_user_func()把第一个参数作为回调函数调用
    Note: If you want to invoke protected or private methods, you'll first have to make them accessible using the setAccessible() method (see http://php.net/reflectionmethod.setaccessible ).
    This method can be used to call a overwritten public method of a parent class on an child instance
    The following code will output "A":
    <?php
    class A
    {
      public function foo()
      {
        return __CLASS__;
      }
    }
    class B extends A
    {
      public function foo()
      {
        return __CLASS__;
      }
    }
    $b = new B();
    $reflection = new ReflectionObject($b);
    $parentReflection = $reflection->getParentClass();
    $parentFooReflection = $parentReflection->getMethod('foo');
    $data = $parentFooReflection->invoke($b);
    echo $data;
    ?>
    
    Seems that Reflection doesn`t resolve late static bindings - var_dump will show "string 'a' (length=1)".
    <?php
    class ParentClass { protected static $a = 'a'; static public function init() { return static::$a; } }
    class ChildClass extends ParentClass { protected static $a = 'b'; }
      
    $r = new ReflectionClass('ChildClass');
    var_dump($r->getMethod('init')->invoke(null));
    ?>