zoukankan      html  css  js  c++  java
  • [转]用星际快速入门PHP面向对象编程

    前言
    面向对象博大精深,对于从未接触过得的人,会觉得一头雾水。学习的资料很多,但大多比较
    抽象,所以我用经典的游戏-星际争霸来讨论PHP 面向对象。
    现在假设我们来用PHP 开发星际争霸,从而接触PHP 面向对象。
    注意,为了便于学习,除了特殊说明,否则,各部分代码之间没有关联。而且同一件事情往往
    用的是不同的代码。另外我也不去考证各个兵种的属性数字,仅仅用来说明。
    一、类和对象
    如果玩家制造了一个机枪兵,那么我们怎么表示他呢,因为每个机枪兵有几个基本的数据要记
    录:剩余的血,杀敌数量,攻击力等等。我们可以用一个数组来记录一个机枪兵剩余的血和杀敌数
    量,因为这对于每个机枪兵是独立的。但攻击力比较麻烦,因为经过升级,攻击力会增加,这就必
    须要找出所有表示机枪兵的数组,然后进行修改,非常麻烦。从这里我们可以看出一件事情,首先
    每个机枪兵有独立的数据需要记录和修改,比如剩余的血。同时他们有相同的数据需要共用,比如
    攻击力。
    这时候面向对象就能帮上我们的忙了。
    1.1 类的定义
    我们先来处理一部分问题,也就是每个机枪兵独有的数据。
    这叫做类,我们建立了一个表示所有机枪兵的类marine,这里面保留了需要每个兵独有的数据,
    比如上面代码里的剩余的血。
    1.2 对象的创建和使用
    接下来我们来使用对象,也就是每个机枪兵:
    通过new 后面加一个类的名字和括号,我们新建了一个机枪兵$m1,$m1 被叫做类marine 的对
    象,我们可以把它想象成一个特殊变量,只不过里面保存了多个数据。
    教程连载:用星际快速入门PHP 面向对象编程(一)
    网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》87/104
    如果需要使用或者操作某个机枪兵的血(对象的属性),只要用$m1->blood 来表示就可以了:
    我们再建立一个机枪兵:
    如果此时$m1 被敌人攻击过了,还剩下10 个血。而$m2 没受过攻击:
    使用对象可以很简单的保存每个机枪兵的血,不会互相影响。
    如果机枪兵$m1 攻击敌人的时候,可以这样使用对象的方法:
    不同的类内可以用同名的函数,比如小狗的类Zergling 里面也可以有一个函数attack。
    要注意的是,从PHP5 开始,无论在哪里改变一个对象的属性,都能改变它。比如上面一个小
    狗对象被作为参数传入机枪兵的attack 函数,执行函数之后这个小狗对象的血减少了,这和一般的
    函数不同。但这是很直观的,如果一个小狗被攻击了,它的血就应该减少。
    二、构造函数和析构函数
    每次我们新建一个机枪兵的时候,总人口应该加1,如果一个机枪兵被杀,人口应该减少1。
    可以通过构造函数和析构函数来自动处理:
    教程连载:用星际快速入门PHP 面向对象编程(一)
    网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》88/104
    在一个类中,名字为__construct 的函数叫做构造函数,每次new 新建一个类的对象的时候就会
    执行:
    在一个类中,名字为__destruct 的函数叫做析构函数,每次销毁一个类的对象的时候就会执行:
    三、静态
    机枪兵的攻击力是属于所有机枪兵对象,每个机枪兵的攻击力都是一样的,如果升级,应该一
    起变化。
    这就用到static,表示静态:
    静态属性表示类所有的对象都共享的属性,一旦改变,所有的对象都跟着变化。
    静态属性用static 开头,比如上面的static $attackNumber。
    静态属性可以用类直接访问:
    教程连载:用星际快速入门PHP 面向对象编程(一)
    网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》89/104
    如果类以内的函数访问,用self::$attackNumber 表示本类的$attackNumber 属性,所以如果我们
    升级了机枪兵的攻击力,所有的机枪兵都受影响,这就是面向对象的好处之一,也解决了我们前面
    讨论的共同数据的问题。
    函数也可以是静态的,这样就可以用类直接访问,不需要新建对象来调用:
    如果科技建筑升级完毕,直接就调用这个函数:
    四、继承
    兵营用来造机枪兵,坦克房用来制造坦克,他们都是建筑,但是却有很多不同,如果用一个类
    “建筑”来表示,很困难。但我们要保留他们的共性,比如都能飞行,不希望飞行的代码在各个类
    重复写,又要让他们能各自独立的生产不同的东西。所以我们可以用继承来处理,继承表示父子关
    系,被继承的叫父类,继承的叫子类。用extends 表示继承
    教程连载:用星际快速入门PHP 面向对象编程(一)
    网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》90/104
    接下来,我们看看继承产生的效果:
    同样是继承建筑类的坦克房类,就无法制造机枪兵,因为这是兵营类的个性。
    如果在子类中的函数调用父类的函数,要使用parent,比如
    注意,一个类只能有一个父类,PHP 不允许多重继承,也就是说一个孩子只能有一个爹,一个
    爹可以有N 个孩子!
    教程连载:用星际快速入门PHP 面向对象编程(一)
    网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》91/104
    五、访问控制
    如果用$attackNumber = 10 表示属性的话,系统默认是public $attackNumber = 10,所以建议这
    样写:
    public 表示这个属性是公共的,也就是在任何地方都可以访问和操作的。但这就存在一些问题,
    如果有玩家知道了类marine 的一些代码结构,那他做个简单的补丁程序,运行的时候加载上去:
    //补丁
    这样的话,他的机枪兵有10000 的攻击力,呵呵,这样的话,谁打得过他!
    为此我们要用private,表示这个属性只有类里面的函数才能访问:
    这样一来,只有升级才能改变机枪兵的攻击力。但是现在往往是团队开发,而且很多用到类的
    继承,如果private 的话,子类就无法访问了,但又不希望随便都可以修改某些属性。
    那么可以用protected,protected 的属性可以被子类的函数访问。
    六、重载
    6.1 属性重载
    如果我们把地面部队作为一个类,让机枪兵类来继承他,这时候如果地面部队类和机枪兵类里
    面都定义了攻击力$attackNumber,那么每个兵的攻击力就决定于机枪兵类,而不是地面部队。这就
    叫做重载。
    教程连载:用星际快速入门PHP 面向对象编程(一)
    网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》92/104
    6.2、函数重载
    重载也可以用于函数,子类的函数如果和父类函数同名,除非另行说明,否则子类的对象默认
    调用子类内的函数。
    比如人族的鬼兵类ghost 和神族类的黑暗圣堂类(隐刀),都是隐形兵种,但是鬼兵隐形的时候
    会减少能量,黑暗圣堂根本没有能量属性。
    如果我们把隐形能力作为父类,鬼兵类ghost 和神族类的黑暗圣堂类DarkTemplar 来继承它,
    同时实现不同的隐形代码:
    教程连载:用星际快速入门PHP 面向对象编程(一)
    网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》93/104
    我们来看看效果:
    七、接口
    PHP 不允许多重继承,那么有些问题就难办了。
    假如为了规范处理,我们把隐形的能力建立一个类,然后把飞行能力放一个类,那么人族的侦
    察机怎么处理?不能继承两个类!那我们不用继承也行,但是开发组的其他人一旦涉及到侦察机,
    要把长长的代码读一遍吗?有没有可能知道类的所有方法的简要描述?
    可以用到接口interface,一个类可以执行(继承)多个接口,接口中定义的函数不能有函数体,
    执行接口的类必须将这些函数完整定义。
    这样我们知道侦察机实现了飞行能力接口,必然有接口里面描述的飞行方法:
    教程连载:用星际快速入门PHP 面向对象编程(一)
    网站:http://www.phpchina.com 投稿:phper@phpchina.com 《PHPer》94/104
    八、总结
    我们讨论了PHP 面向对象的基本知识,通过星际争霸这一经典的游戏来说明,大家可以看到面
    向对象的初步作用。
    我们看到通过面向对象可以使代码更加清晰,类将代码组织起来,比较方便的重复使用。同时
    对象也减少了变量的冲突,方便相关性数据的保存和使用。
    如果要解决的问题涉及很多方面,面向对象可以演化出更加灵活和有技巧的方式,比如通常提
    到的设计模式,和很多框架。
    当然,面向对象也有缺点,从上面的代码可以看到,首先代码就多了,简单的任务如果定义许
    多类,反而麻烦。对于简单任务,面向对象也可能使代码运行的效率降低。
  • 相关阅读:
    tarjan algorithm
    最小生成树
    Manacher's Algorithm (马拉车算法)
    KMP
    Trie(字典树)
    Hash
    GDB调试
    图论
    扫描线
    STL
  • 原文地址:https://www.cnblogs.com/istep/p/2242188.html
Copyright © 2011-2022 走看看