php __call()与call_user_func_array()理解
1. mixed __call ( string name, array arguments )
The magic method __call() allows to capture invocation of non existing methods. That way __call() can be used to implement user defined method handling that depends on the name of the actual method being called. This is for instance useful for proxy implementations. The arguments that were passed in the function will be defined as an array in the $arguments parameter. The value returned from the __call() method will be returned to the caller of the method.
译文: 这个魔术方法允许用户调用类中不存在的方法,它用于实现那些 依赖于在被调用时的真正方法名的方法. 典型的例子是用来实现代理. 方法的参数$arguments是一个数组 ,__call()的返回值返回给方法调用者
白话文: 这个方法主要是用来实现动态方法调用, 如果再一个类定义了__call()这个方法, 当用户调用这个类的一个不存在的方法时,他可以使用调用的那个不存在的方法的方法名和参数做出用户定义在__call()方法体内的相应操作,此时__call()方法的参数就是被调用的那个不存在的方法的方法名和参数
例子
<?php class Person { function talk( $sound ) { echo $sound; } function __call( $method , $args ) { echo 'you call method ' . $method . '<br>'; echo 'and the arguments are <br>'; var_dump( $args ); } } $person = new Person(); $person->test( 1 , TRUE ); ?>
<?php class Person { function talk( $sound ) { echo $sound; } function __call( $method , $args ) { echo 'you call method ' . $method . '<br>'; echo 'and the arguments are <br>'; var_dump( $args ); } } $person = new Person(); call_user_func_array( array( $person , 'talk' ) , array( 'hello' ) ); ?>
class Person { function talk( $sound ) { echo $sound; } function __call( $method , $args ) { echo 'you call method ' . $method . '<br>'; echo 'and the arguments are <br>'; var_dump( $args ); } } class PersonProxy { private $person; function __construct() { $this->person = new Person(); } function __call( $method , $args ) { call_user_func_array( array( $this->person , $method ) , $args ); } } $person_proxy = new PersonProxy(); $person_proxy->talk( 'thank you' );