__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权限显然是不合适的,也不符合面向对象的设计思想。
- 空白目录
- 第1章 面向对象思想的核心概念
- 1.1 面向对象的“形”与“本”
- 1.1.1 对象的“形”
- 1.1.2 对象的“本质”
- 1.1.3 对象与数组
- 1.1.4 对象与类
- 1.2 魔术方法的应用
- 1.2.1 construct和destruct方法
- 1.2.2 set和get方法
- 1.2.3 call和callStatic方法
- 1.2.4 __toString方法
- 1.3 继承与多态
- 1.3.1 类的组合与继承
- 1.3.2 各种语言中的多态
- 1.4 面向接口编程
- 1.4.1 接口的作用
- 1.4.2 对接口的思考
- 1.5 反射
- 1.5.1 如何使用反射API
- 1.6 异常和错误处理
- 1.6.1 如何使用异常处理机制
- 1.6.2 怎样看PHP的异常
- 1.6.3 PHP中的错误级别
- 1.6.4 PHP中的错误处理机制
- 1.7 本章小结
- 第2章 面向对象的设计原则
- 2.1 面向对象设计的五大原则
- 2.2 一个面向对象留言本的实例
- 2.3 面向对象的思考
- 2.4 本章小结
- 第3章 正则表达式基础与应用
- 3.1 认识正则表达式
- 3.2 正则表达式中的元字符
- 3.3 正则表达式匹配规则
- 3.4 构造正则表达式
- 3.5 正则在实际开发中的应用
- 3.6 正则表达式的效率与优化
- 3.7 本章小结