__call()魔术方法,主要用于在对一个未定义的成员函数调用时被自动调用。
    同时在对于没有控制权限,例如被设置为private 或 protected 的成员函数调用时,也会自动触发该魔术方法:

    1. <?php
    2. class Test {
    3. public function __call($name, $argument) {
    4. echo '调用不存在的方法名是:' . $name . '<br>参数是:';
    5. print_r($argument);
    6. echo '<br>';
    7. }
    8. private function bbb(){}
    9. }
    10. $obj = new Test();
    11. $obj->bbb();

    注意,当需要对声明为static静态成员函数做调用监听时,需要使用__callStatic()魔术方法,他们两者的区别是:

    1、__call() 当要调用的方法不存在或权限不足时,会自动调用__call() 方法。
    2、__callStatic() 当调用的静态方法不存在或权限不足时,会自动调用__callStatic()方法。
    

    在上面的课件内容中,我们不是曾经提到过,PHP的Class实现重载机制实际上有2种实现方式,而其中一种就是依靠call()魔术方法。
    在对象中调用一个不可访问的方法时,
    call()会被自动调用
    像上面的案例代码中,$name参数是要调用的方法名称 $argument参数是被调用方法的参数数组。
    依赖这2个参数,我们就可以实现class的重载功能:

    <?php
    class demo{
        public function __call($name, $arguments){
            if($name == "method"){
                switch (count($arguments)) { #获得参数数组个数
                    case 2:
                        $this->method2($args[0],$args[1]);
                        break;
                    case 3:
                        $this->method3($args[0],$args[1],$args[2]);
                        break;
                }
            }
        }
        private function method2($var1, $var2){
            # code...
        }
        private function method3($var1, $var2, $var3){
            # code...
        }
    }
    # 调用
    $obj = new demo();
    $obj->method(1, 2);
    $obj->method(1, 2, 3);