🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
__set和__get是两个比较重要的魔术方法。 举个简单的例子: ``` <?php /** * User: 三千 * Date: 16/3/15 * Time: 下午7:35 */ class Account{ private $user = 1; private $pwd = 2; } $a = new Account(); echo $a->user; $a->user = 5; echo $a->user; echo $a->big; ``` 返回结果: ``` Fatal error: Cannot access private property Account::$user in /www/code/php_core/1.2.1.php on line 14 ``` 报错的意思是,不能访问Account对象的私有属性user,我们使用__set魔术方法: ``` <?php /** * User: 三千 * Date: 16/3/15 * Time: 下午7:35 */ class Account{ private $user = 1; private $pwd = 2; public function __set($name,$value){ echo "setting $name to $value \r\n"; $this->$name = $value; } public function __get($name){ if(!isset($this->$name)){ echo '未设置'; $this->$name = "正在为你设置默认值"; } return $this->$name; } } $a = new Account(); echo $a->user; $a->user = 5; echo $a->user; echo $a->big; ``` 返回结果 ``` 1setting user to 5 5未设置setting big to 正在为你设置默认值 正在为你设置默认值% ``` 可以看到,这次没有报错。 若类中定义了__set和__get这一对魔术方法,那么当给对象属性赋值或者取值时,即使这个属性不存在,也不会报错,一定程度上增强了程序的健壮性。 在account类里,user属性的访问权限是私有的,私有属性意味着这个属性是类是“私有财产”,只能在类内部对其进行操作。如果没有__set这个魔术方法,直接在类的外部对属性进行赋值操作是会报错的。只能通过在类中定义一个public的方法,然后在类外调用这个公开的方法进行属性读写操作。 这两个魔术方法,不需要显式的加上public,本身就是public的,所以操作更简单。这对方法在操作类变量时是自动调用的。如果可以把类的属性定义为pubic的,这样就可以随意在类的外部进行读写。 不过,如果只是为了方便,类属性在任意时候都定义成public权限显然是不合适的,也不符合面向对象的设计思想。