1. 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。
2. 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系。
举例说明:
使用private这个关键字来对属性和方法进行封装:
原来的成员:
public $name; // 声明人的姓名
public $sex; // 声明人的性别
public $age; // 声明人的年龄
public function run(){……}
改成封装的形式:
private $name; // 把人的姓名使用private关键字进行封装
private $sex; // 把人的性别使用private关键字进行封装
private $age; // 把人的年龄使用private关键字进行封装
private function run(){……} // 把人的走路方法使用private关键字进行封装
注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字”public”。
PHP的魔术方法:
在类与对象我们队对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性的”__isset()”和删除属性的方法”__unset()”。
__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值, 这个方法不用我们手工的去调用,是在直接获取私有属性的时候自动调用的。
__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,是在直接设置私有属性值的 时候自动调用的,同样属性私有的已经被封装上了,如果没有__set()这个方法,是不允许的。
举例说明:
<?php
class Person {
// 下面是人的成员属性, 都是封装的私有成员
private $name; //人的名字
private $sex; //人的性别
private $age; //人的年龄
// __get()方法用来获取私有属性
function __get($property_name) {
echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br />";
if (isset($this->$property_name)) {
return ($this->$property_name);
} else {
return null;
}
}
// __set()方法用来设置私有属性
function __set($property_name, $value) {
echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br />";
$this->$property_name = $value;
}
}
$p1 = new Person();
// 直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值
$p1->name = "张三";
$p1->sex = "男";
$p1->age = 20;
// 直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值
echo "姓名:" . $p1->name . "<br />";
echo "性别:" . $p1->sex . "<br />";
echo "年龄:" . $p1->age . "<br />";
?>
注释:如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。
__isset() 方法:"isset()" 是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。
__unset()方法:“unset()”这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。
举例说明:
<?php
class Person {
// 下面是人的成员属性
private $name; // 人的名子
private $sex; // 人的性别
private $age; // 人的年龄
// __get()方法用来获取私有属性
private function __get($property_name) {
if (isset($this->$property_name)) {
return ($this->$property_name);
} else {
return NULL;
}
}
// __set()方法用来设置私有属性
private function __set($property_name, $value) {
$this->$property_name = $value;
}
// __isset()方法
private function __isset($nm) {
echo "isset()函数测定私有成员时,自动调用<br />";
return isset($this->$nm);
}
//__unset()方法
private function __unset($nm) {
echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br />";
unset($this->$nm);
}
}
$p1 = new Person();
$p1->name = "this is a person name";
// 在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true
echo var_dump(isset($p1->name)) . "<br >";
echo $p1->name . "<br />";
// 在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性
unset($p1->name);
// 已经被删除了,所这行不会有输出
echo $p1->name;
?>
注释:
1、__set(), __get() 是专门为类的私有属性(private、protected)设立的,对于类的公开(public)属性,外面是可以直接访问与设置的(如:$p1->name),即不走__set(),__get()函数的!!!)
2、在PHP5.3及以后,上述魔术方法(__get(),__set(),__isset(),__unset() 等)提倡是 public 类型的,并且不是 private方法,否则会给出警告信息!