无忧岛

15 七, 2010

php面向对象OOP编程教程(六) – 类的封装

Posted by: kinglife In: php

这里给大家一个小小的友情提示,由于论坛里的代码没有颜色提示,而代码里又含有大量详细的注释,虽然我已经仔细书写代码格式,但是在颜色相同的情况下,可能仍然不便于阅读。因此在代码太长导致大家眼花缭乱的时候,大家可以把代码复制下来,到有颜色提示的编辑器里阅读,比如Zend Studio、Deamweaver、Eclipse等等,这样感觉会好很多。

好,那么我们今天开始玩类的封装,什么是封装呢?额……就是起来(汗), 其实大部分专业术语也很好从字面上的意思去理解,只不过绝大多数人一涉及到技术方面的问题,就习惯性的往高深的方向去想,其实没有必要,我们要尽量以我们自己容易理解的方式去想,这才是玩道,因为它们本就不是什么高深莫测的东西。

封装的作用是不允许别人随意从类的外部使用属性和方法,只留给别人一些有限的属性和方法去使用。OOP是鼓励使用封装的,那么到底封装有什么好处呢?很多书对于封装的好处三言两语就带过了,十分含糊,我在这里会尝试着给大家讲明白。

比如大家熟知的国内品牌机联想电脑,它就属于一种封装,对于不懂硬件的朋友来说,CPU、显卡、主板、硬盘、内存这些乱七八糟的硬件都被机箱封装起来了。机箱里面到底有些什么硬件?这些硬件对于电脑来说有些什么作用?它们到底是如何协同运转的?我们不需要去关心!因为我们只要会开机、会关机、会玩游戏就好了,这样我们的目的就达到了!但同时机箱里又提供了光驱、电源等有限的东西,方便我们可以从外部直接使用它们。

所以你说,一个封装的类,你拿过来,只需要知道怎么使用就可以了,根本不需要去关心它内部是怎么实现功能的,根本不需要去瞅那复杂的代码一眼,这是对于使用者来说的。

那么对于开发者来说呢?很多时候开发者不希望使用者能够随意去碰类内部的东西,因为那样可能会导致一些不可预料的事情发生,就像不懂硬件的朋友把机箱拆开,把里面硬件胡乱的拔来插去,那么电脑可能就无法启动,甚至烧坏,爆炸也说不定,这肯定不是开发者愿意看到的事情。

通常一个完整的系统是由无数个封装类构成的,它们每个都是一个独立的部分,但是又可以相互相通,这对于于团队开发、分工协作是十分有帮助的,比如说你做角色,我做地图,我要用角色的时候就直接就拿过来用,谁有闲功夫管你角色类里面都写了些什么代码,我自己的工作都还忙不过来呢;而且还大大的减少了排错的难度,就像电脑坏了,显卡坏了就修显卡,内存坏了就修内存,不需要把整个机箱里的硬件从头到尾修一遍,那还不如丢掉重新买一台。

所以说,我们要把尽多的工作交给类完成,把尽少的工作交给人完成,这才是正确的OOP主导思想。在类里面,属性和方法通常有公有的和私有的,又是些专业术语,不要紧张,我再次把它们通俗化:

公有就是允许别人用
私有就是不许别人用

在PHP中,类的属性和方法默认公有的,但是我们不建议用默认的方式来定义公有的属性和方法,因为那不利于代码的可读性,我们从小要养成良好的编程习惯,我们要习惯用public访问修饰符来声明某个属性和方法是公有的。

请看下面两例代码,它们实际上是一样的,只不过一个是默认的,另一个是我们通过访问修饰符定义的。

默认方式(不建议使用)

class 类的名称
{
    var $属性的名称; //没有访问修饰符,有var关键字

    function 方法的名称(参数列表) //没有访问修饰符
    {
        ……
    }
}

声明方式(建议使用)

class 类的名称
{
    public $属性的名称; //有访问修饰符,var关键字被去掉了

    public function 方法的名称(参数列表) //有访问修饰符
    {
        ……
    }
}

注意:声明属性的时候,我们先要去掉var关键词,然后再前面加上访问修饰符public;声明方法的时候,直接在前面加上访问修饰符public即可。

我们来认识一下PHP类中的三个访问修饰符:

访问修饰符 声明类型 允许外部使用 允许子类使用
public 公有
protected 私有  
private 私有    

从上表我们可以看到,通过protectedprivate这两个访问修饰符可以将属性和方法声明为私有的,即将它们封装起来,不许别人用。它们的区别仅仅在于对子类的访问控制,关于子类我们会在后面类的继承里面讲到,现在不用去管它,我们现在的首要任务是跟这三个访问修饰符混个熟脸。

好,我们来玩一下代码,看看是不是真的是这么一回事情:

class Role //角色类
{
    //属性部分
    public $role_name; //角色的名字,请尝试将public换成protected或private进行封装

    //方法部分
    public function roleTalk() //角色说话,请尝试将public换成protected或private进行封装
    {
        echo '我会说话';
    }
}

//实例化一个对象
$brother_chun = new Role();

//设置属性
$brother_chun->role_name = '春哥';

//访问方法
$brother_chun->roleTalk();

上面这段代码将属性和方法声明为public时,程序运行正常;若尝试将属性或方法的访问修饰符换成protectedprivate,那么程序就会报错。因为私有的属性和方法是不允许从类的外部使用的。大家可以自己去亲自试验一下,体会一下,这样可以加深理解。那……今天就玩到这里吧。

作者:hetty 首发地址:http://www.im286.com/thread-4823948-1-1.html

版权所有,转载时必须以链接形式注明作者和原始出处及本声明:KingLife@无忧岛

本文链接: http://www.islandcn.com/post/774.html



No Responses to "php面向对象OOP编程教程(六) – 类的封装"

Comment Form

Flickr PhotoStream

    flickrRSS probably needs to be setup

About

Name:KingLife
Email:lifewz#163.com