3.4 封装性

类的封装是对属性或方法的访问控制,通过在前面添加关键字public(公有)、protected(受保护)或private(私有)实现。被定义为公有的类成员,可以在任何地方被访问;被定义为受保护的类成员,则可以被其自身以及其子类和父类访问;被定义为私有的类成员,则只能在被定义所在的类访问。

注意类属性必须定义为公有、受保护、私有之一。类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。

注意是实现访问控制,而不是拒绝访问。也就是说,私有化属性后,需要提供相应的方法,让用户通过提供的方法处理属性。

3.4.1 设置私有成员

定义类的时候,使用private关键字可以将成员属性和方法设置为私有的。只能被这个类的其他成员方法调用,而不能被其他类中的方法调用。

【例3-6】(实例文件:ch03\Chap3.6.php)设置私有成员。

在IE浏览器中运行结果为Fatal error:Cannot access private property My::$name in…,含义是无法访问私有属性。如果把echo $my->name;注释掉,刷新浏览器,运行结果变为Fatal error:Call to private method My::say()from context '' in…,含义是无法访问私有方法。

3.4.2 私有成员的访问

在类的封装中,可以自定义方法访问私有成员,如例3-7中的setAttr()和getAttr()方法。因为setAttr()和getAttr()方法是该类中的方法,所以可以访问该类的私有成员。而这两个方法是公有的,所以在类外可以访问这两个方法。因此,通过这两个方法可以在类外面访问该类的私有成员。

下面通过一个实例进行介绍。在实例中定义了setAttr()和getAttr()两个方法。setAtte()方法用来为私有属性赋值,getAttr()方法用来获取私有属性。

【例3-7】(实例文件:ch03\Chap3.7.php)访问私有成员。

在IE浏览器中运行结果为“小红12岁”。

除了自定义方法以外,还可以使用PHP预定义的方法获取和修改私有成员。

PHP中预定义了__get()和__set()方法,其中__get()方法用于获取私有成员属性值,__set()方法用于为私有成员属性值赋值,这两个方法获取或设置私有属性值时都是自动调用的。关于__get()和__set()方法将在3.4.3节进行介绍。

3.4.3 __set()、__get()、__isset()和__unset()方法

__set()、__get()、__isset()和__unset()是实现属性重载的魔术方法。

提示重载是指动态地创建类属性和方法。本节介绍的是重载属性的魔术方法,后面还会介绍重载方法的魔术方法,如__call()方法。

注意所有的重载方法都必须被定义为public。

__set()、__get()、__isset()和__unset()方法的具体介绍如表3-1所示。

表3-1 重载的魔术方法

注意这些魔术方法的参数都不能通过引用传递。

【例3-8】(实例文件:ch03\Chap3.8.php)实现属性重载的魔术方法。

在IE浏览器中运行结果如图3-5所示。

图3-5 实现属性重载的魔术方法