__call()方法说明

0xh*_*yuu 2 php methods magic-methods

我有这部分代码:

class FTPClient
{
    public function __construct() {
        $args_num=func_num_args();
        echo $args_num;
        $this->{"__construct".($args_num===0 ? '' : $args_num)}(func_get_args());
    }

    function __call($name,$args) {
        echo $name,count($args),'<br/>';
    }

    public function open() {
        echo 'open';
    }
}
    $o = new FTPClient('127.0.0.1','user','pass');
    $o = new FTPClient();
    $o = new FTPClient('127.0.0.1','user');
    $o->close();
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

3__construct31
01__construct11 //Don't understand how this output came together?!
2__construct21
close0

有人会这么善良,可以解释一下这个输出的第二行吗?

Riz*_*123 5

  1. 第一个例子

    $o = new FTPClient('127.0.0.1','user','pass');

    你有3个参数,意思是3用这一行打印:

    $args_num = func_num_args();
    echo $args_num;  //output: 3
    

    之后,您尝试调用该方法__construct3():

    $this->__construct3(func_get_args());

    哪个不可访问,意味着__call()被调用.在那个魔术方法中,你打印名称,这里__construct3和参数的数量,这里的参数数组,意思是1.

    输出:

    3__construct31
    
    Run Code Online (Sandbox Code Playgroud)
  2. 第二个例子

    $o = new FTPClient();

    你有0个参数,意味着0用这一行打印:

    $args_num = func_num_args();
    echo $args_num;  //output: 0
    

    之后你试图调用方法__construct(),构造函数:

    $this->__construct(func_get_args());

    并且构造函数是可调用的,因此__call()不会在此处调用.而是再次调用构造函数,但是使用一个包含参数数组的数组,这里是一个空数组.

    现在在第二个调用中你有1个参数,意味着1用这一行打印:

    $args_num = func_num_args();
    echo $args_num;  //output: 1
    

    之后,您尝试调用该方法__construct1():

    $this->__construct1(func_get_args());

    现在__construct1()无法访问,意味着__call()被触发.在那个魔术方法中,你打印名称,这里__construct1和参数的计数,这里是一个带参数数组的数组,意思是1.

    输出:

    01__construct11
    
    Run Code Online (Sandbox Code Playgroud)

笔记:

  • __call() 当您尝试调用无法访问的方法时会被触发.