1, 什么是封装性?
把对象的成员(属性,方法)结合成一个独立的相同单位,并尽可能隐藏对象的内部细节。
属性和方法都可以封装!
2,方法的封装
在类的成员方法定义的时候前面加上private[protected,public...]关键字
如下:
private function say(){
}
private:私有的------用这个关键字修饰的成员只能在对象内部访问!(即只能用$this->say()访问,不能在对象外部访问。)
3,属性的封装
只要一个变量需要在多个方法中使用,就将这个变量声明为成员属性,这样这个变量可以在属性的所有方法中使用
也就是说,成员属性是对象中的全局变量。
成员属性值的变化其实就是在改变方法的执行行为,进而改变了对象的功能。
甚至,成员属性的不正常会导致对象的功能不正常!!!
(如手机电压的值出现了220V,电话就玩完了。)
所以需要封装成员属性(安全性)来限制外部修改成员属性的值!(即使允许在外部修改成员属性的值,也应该限定一个范围。)
当不需要(不允许)修改成员属性的值时,就应该封装成员属性。
当需要对成员属性的值在某给范围内控制时,可以先封装成员属性,然后再提供一个公有的方法,可利用这个方法来控制成员属性的值的范围,甚至制造假象。
如:class Age{
private $age;
function setAge($age){
if($age>100 || $age <0) return;
else $this->age=$age;
}
}
4,封装的作用:
a,使用private关键字使其只能在内部使用。
b,如果一个类中有100个方法,封装了95个方法(为另外5个服务的方法),只有5个方法可以使用,则这个类对外提供的方法只有5个。将细节进行了隐藏。提供了有限的对外接口。
c,安全性会更高!
$object = new Age;
$object->setAge(500);
5,与封装有关的一些魔术方法(已经封装的成员属性)
__set();是直接在对象外部设置私有成员属性值时,自动调用的方法。(用于成员赋值)
__get();是直接在对象外部获取私有成员属性值时,自动调用的方法。(用于成员取值)
__isset();直接检查(使用isset()检查)对象中私有属性是否存在时,自动调用的方法。
__unset();直接删除(使用unset()删除)对象中私有属性是否存在时,自动调用的方法。