首页 > 编程笔记 > PHP笔记 阅读:9

PHP中的__get()和__set()魔术方法(新手必看)

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

本节带大家系统学习两个魔术方法,分别是 __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;
?>
本例使用了 tAuto 类的 color 属性,但在 tAuto 类中并没有定义 color 属性,代码执行后会显示 red,这里就是 __get() 和 __set() 方法在工作。

实际开发工作中,__get() 和 __set() 方法可以让属性的使用既灵活又严格。下面的代码(/demo/tCar.php)定义了 tCar 类,其中定义了 __get() 和 __set() 方法。
<?php
class tCar
{
    private $arrData = array();
    //
    public function __get($name)
    {
        switch($name)
        {
            case "doors";
                return intval($this->arrData["doors"]);
                break;
            default:
                return null;
                break;
        }
    }
    //
    public function __set($name, $value)
    {
        switch($name)
        {
            case "doors";
                if($value>=0 && $value<=5)
                    $this->arrData["doors"] = $value;
                else
                    $this->arrData["doors"] = 4;
                break;
            default:
                break;
        }
    }
}
?>
本例只处理了 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() 方法操作属性时,条件可松可紧,让开发工作更加灵活、高效,可以根据项目实际情况合理应用。

相关文章