购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

6.5 魔术方法

在PHP类中,魔术方法是一些特殊功能的方法,其名称都使用两个下画线(_)作为前缀,如前面介绍的构造函数和析构函数。本节将继续介绍一些常用的魔术方法。

6.5.1 _ _get()和_ _set()方法

_ _get()和_ _set()方法用于处理没有显式定义的属性,其中,_ _get()方法在读取无法访问的属性时调用,_ _set()方法在设置无法访问的属性时调用。通过这两个方法,可以动态操作对象的属性,也就是说,对于类中没有明确定义的属性,PHP类可以自动维护,如下面的代码。

    <?php
    require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tAuto.php";

    $car = new tAuto();
    $car->color = "red";
    echo $car->color;
    ?>

代码执行后会显示red。本例使用了tAuto类的color属性,但在tAuto类中并没有定义color属性,这里就是_ _get()和_ _set()方法在工作。

实际开发工作中,_ _get()和_ _set()方法可以让属性的使用既灵活又严格。下面的代码(/demo/tCar.php)定义了tCar类,其中定义了_ _get()和_ _set()方法。

本例只处理了doors属性,在_ _get()方法中,获取其他属性的数据时会返回null值;在_ _set()方法中,设置其他属性的数据时什么也不做。

在下面的代码中测试tCar类的使用。

    <?php
    require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tCar.php";

    $car= new tCar();
    $car->doors = 10;
    echo $car->doors,"<br>";
    $car->doors = 3;
    echo $car->doors;
    ?>

代码执行后会显示4和3。

对于doors之外的属性会出现什么情况呢?可以通过下面的代码来测试。

    <?php
    require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tCar.php";

    $car= new tCar();
    $car->model = "X19";
    var_dump($car->model);
    ?>

代码执行后会显示NULL。tCar类中,对属性的使用进行了限制,tCar类的实例只能使用doors属性,读取其他属性值时只能获取null值。

在使用_ _get()和_ _set()方法操作属性时,条件可松可紧,让开发工作更加灵活、高效,可以根据项目实际情况合理应用。

6.5.2 _ _call()和_ _callStatic()方法

_ _call()方法在调用不可访问的实例方法时执行,_ _callStatic()方法则在调用不可访问的静态方法时执行。这两个方法的参数定义相同,其中,参数一指定调用的方法名称,参数二指定一个数组,其中包含了调用方法时带入的参数。

下面的代码演示了_ _call()方法的应用。

下面的代码演示了_ _callStatic()方法的应用。

6.5.3 _ _toString()方法

在代码中需要定义对象显示的信息时,可以在类中创建_ _toString()方法,它将返回用于描述对象的文本内容(string类型)。

下面的代码在/demo/tCar.php文件的tCar类中添加_ _toString()方法。

这里使用的_ _CLASS_ _前后都有两个下画线(_),这个特殊的标识会返回当前类的名称。

使用echo语句显示tCar对象时,就会显示对象的类型名称,如下面的代码。

    <?php
    require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tCar.php";

    $car= new tCar();
    echo $car;
    ?>

执行代码会显示tCar。

6.5.4 _ _invoke()方法

以调用函数的方式调用一个对象时,_ _invoke()方法会被自动执行。下面的代码在tAuto类中添加_ _invoke()方法。

下面的代码测试_ _invoke()方法的效果。

    <?php
    require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tAuto.php";

    $car= new tAuto();
    $car("A33",4);
    echo $car->model,"<br>";
    echo $car->getDoors();
    ?>

代码执行结果见图6-4。

图 6-4

6.5.5 _ _debugInfo()方法

先来看一个print_r()函数调用的示例。

    <?php
    require_once $_SERVER["DOCUMENT_ROOT"]."/demo/tAuto.php";

    $car= new tAuto();
    $car("A33",4);
    print_r($car);
    ?>

代码执行结果见图6-5。

图 6-5

默认情况下,使用print_r()或var_dump()函数查看对象信息时,会显示对象的所有属性数据,包括公共的、私有的和受保护的。本例中,调用print_r()函数查看tAuto类的实例$car时,就显示了它的所有属性,包括私有的doors属性。

如果限制(或简化)对象显示的信息,可以在类中定义_ _debugInfo()方法,它将返回一个数组,其中包含了对象属性的名称和数据。下面的代码在tAuto类中添加_ _debugInfo()方法。

再次通过print_r()函数查看tCar对象的信息,只会看到model属性的值,见图6-6。

图 6-6 WeT4hTES8VSS2F18ysjWHq1empJjTE+KnV1ov8jPU2gcXvsaChNpAxKqD+oYaw1t

点击中间区域
呼出菜单
上一章
目录
下一章
×