一般说来,把数据声明为 private 进而封装起来更符合现实逻辑,然而,在对象外部对已封装的数据进行读写操作往往非常频繁,虽然可以像上文那样为每个数据都编写一个 getxxx() 和 setxxx() 方法,但这就意味着程序里面会出现非常多的 getxxx() 和 setxxx() 方法。一旦由于某些原因而导致类内部的 get 或者 set 方法需要重新命名,那需要修改的地方将会是茫茫多……
于是,从 php5 开始,php 给我们预定义了 4 个方法:
function __get(){
}
function __set(){
}
function __isset(){
}
function __unset(){
}
要说明的是,这四个方法都是系统在执行相应操作的时候自动调用的。
__get() 与 __set()
我们知道,一旦函数被封装起来,在类与对象的外部,便无法使用$object->name 的方式直接访问,但如果我们事先在类的内部定义好__get() 方法,当程序使用 $object->name 访问封装数据时,将会自动调用__get() 方法,将其值读出。__set() 方法同理。下面我们将以一个栗子来详细说明。
<?php
class personA {
//在 personA 类中仅有两个被封装的数据
private $name="personA";
private $age="20";
}
class personB {
//在 personB 类中除两个被封装的数据外,还提供了两个方法
private $name="personB";
private $age="19";
function __get($name) {
echo "call on __get() automatically"."<br>";
return $this->$name;
}
function __set($name, $value) {
echo "call on __set() automatically"."<br>";
$this->$name=$value;
}
}
$a=new personA();
$b=new personB();
/*
此处不能用以下代码访问 $a 实例的数据,否则将会报错
因为 personA 类中没有为封装的数据提供相应的访问方法
echo $a->name."<br>";
echo $a->age;
*/
//程序在访问 $b 的数据时候,将自动调用 __get() 方法
echo $b->name."<br>";
echo $b->age."<br>";
//同理,程序在访问$b的数据时候,将自动调用 __set() 方法
$b->name="new_personB";
$b->age="22";
echo $b->name."<br>";
echo $b->age."<br>";
?>
程序的运行结果为:
call on __get() automatically personB call on __get() automatically 19 call on __set() automatically call on __set() automatically call on __get() automatically new_personB call on __get() automatically 22
怎么样?能稍微感受到 __get() 方法和 __set() 方法带来的便利了么?这样一来,我们就不需要为每个封装的数据都写一遍 getxxx() 和 setxxx() 了。值得注意的是,如果在类中我们有需要保护起来的数据,需要在 __get() 方法和 __set() 加以保护,防止修改或读取。
__isset() 与 __unset()
在学习 __isset() 与 __unset() 方法以前呢,有必要先学习一下 isset() 与 unset() 方法:
//检测指定的变量是否存在,存在即返回 true,否则 false isset($name) //删除指定的变量且传回 true unset($name)
__isset() 与 __unset() 方法的作用与 isset() 与 unset() 方法是一样的,当程序在类外部对被封装的数据调用 isset() 或 unset() 方法的时候,程序将自动调用 __isset() 与 __unset()。当然,如果类内部没有定义 __isset() 与 __unset(),程序将会报错。
最后再补充几点注意事项:
- __set()、__get()、__isset()、__unset() 这四个方法都是我们添加到对象里面的,在需要时自动调用的,来完成在对象外部对对象内部私有属性的操作。
- __set()、 __get()、__isset()、__unset() 是专门为类的私有属性(private、protected)设立的,对于类的公开(public)属性,外面是可以直接访问与设置的
- __set()、 __get()、__isset()、__unset() 必须是 public 类型的,并且不是 static 方法,否则会给出警告信息
发表回复