PHP 魔术方法 - __call()

在 PHP 中如果调用一个不存在的方法会怎么样呢 ? 当然是直接报错了,例如下面的代码

<?php 

class Persion
{    

    private $name;         
    private $age;         
    private $sex;         

    public function __construct($name="", $sex="Male", $age=22)
    {   
        $this->name = $name;
        $this->sex  = $sex;
        $this->age  = $age;
    }
}

$person = new Person('Yufei');

// 调用一个不存在的方法
$person->setAge(30);

运行结果如下

[yufei@localhost php]$ php demo.php

Fatal error: Uncaught Error: Class 'Person' not found in /Users/yufei/php/demo.php:18
Stack trace:
#0 {main}
  thrown in /Users/yufei/php/demo.php on line 18

直接提示方法不存在。

对于这种类私有成员 ( 属性 ),一般情况下我们都会创建一对 {get,set} 方法来获取或者设置它。有没有什么快速方式,只要创建一个函数就可以了呢

答案的结果就是魔术方法: __call()

__call() 方法函数原型

__call() 方法可以也只能用在类中,当调用类的对象的一个 不存在 的方法 ( 不存在或该方法不可访问 ) 时自动调用。

该方法有两个参数,第一个参数是调用的那个不存在的 方法名 ,第二个参数是一个数组 ( array ) ,是传递给不存在方法的所有参数组成的数组

__call() 方法的原型如下

__call( string $func_name,  array $args )
{
    // 一些代码
}

范例

下面的范例,我们给 Person 类定义了一个魔术方法 __call(),用于在调用不存在的方法时自动调用

<?php

class Person
{                             
    function say()
    {
           echo "你好,世界!\n";
    }     


    function __call($funName, $arguments)
    {
          echo "调用的方法名为:" . $funName . "(参数:" ;  // 输出不存在的方法的名字
          print_r($arguments); // 输出调用不存在方法的参数
          echo ") 不存在!\n\n";                   
    }                                         
}
$person = new Person();           

$person->run("yufei"); // 因为该方法不存在,所以会自动调用 __call() 方法

$person->eat("apple", "banana"); 

$person->play( 'football', $with='Hero');


$person->say(); // 方法存在时则不会调用 __call() 方法

运行以上示例,输出结果如下

[yufei@localhost php]$ php demo.php
调用的方法名为:run(参数:Array
(
    [0] => yufei
)
) 不存在!

调用的方法名为:eat(参数:Array
(
    [0] => apple
    [1] => banana
)
) 不存在!

调用的方法名为:play(参数:Array
(
    [0] => football
    [1] => Hero
)
) 不存在!

你好,世界!

请注意调用不存在的方法时传递的参数和 __call() 第二个参数里的保存形式

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.