PHP中的__get()和__set()魔术方法(新手必看)
在 PHP 类中,魔术方法是一些特殊功能的方法,其名称都使用两个下画线(_)作为前缀,如前面介绍的构造函数和析构函数。
本节带大家系统学习两个魔术方法,分别是 __get() 和 __set() 方法。
__get() 和 __set() 方法用于处理没有显式定义的属性,其中,__get() 方法在读取无法访问的属性时调用,__set() 方法在设置无法访问的属性时调用。
通过这两个方法,可以动态操作对象的属性,也就是说,对于类中没有明确定义的属性,PHP类可以自动维护。
例如:
实际开发工作中,__get() 和 __set() 方法可以让属性的使用既灵活又严格。下面的代码(/demo/tCar.php)定义了 tCar 类,其中定义了 __get() 和 __set() 方法。
在下面的代码中测试 tCar 类的使用:
对于 doors 之外的属性会出现什么情况呢?可以通过下面的代码来测试。
在使用 __get() 和 __set() 方法操作属性时,条件可松可紧,让开发工作更加灵活、高效,可以根据项目实际情况合理应用。
本节带大家系统学习两个魔术方法,分别是 __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() 方法操作属性时,条件可松可紧,让开发工作更加灵活、高效,可以根据项目实际情况合理应用。