用星际快速入门PHP面向对象编程

上传人:泽*** 文档编号:73407165 上传时间:2022-04-11 格式:DOC 页数:8 大小:267KB
返回 下载 相关 举报
用星际快速入门PHP面向对象编程_第1页
第1页 / 共8页
用星际快速入门PHP面向对象编程_第2页
第2页 / 共8页
用星际快速入门PHP面向对象编程_第3页
第3页 / 共8页
点击查看更多>>
资源描述
用星际快速入门PHP 面向对象编程一、类和对象如果玩家制造了一个机枪兵,那么我们怎么表示他呢,因为每个机枪兵有几个基本的数据要记录:剩余的血,杀敌数量,攻击力等等。我们可以用一个数组来记录一个机枪兵剩余的血和杀敌数量,因为这对于每个机枪兵是独立的。但攻击力比较麻烦,因为经过升级,攻击力会增加,这就必须要找出所有表示机枪兵的数组,然后进行修改,非常麻烦。从这里我们可以看出一件事情,首先每个机枪兵有独立的数据需要记录和修改,比如剩余的血。同时他们有相同的数据需要共用,比如攻击力。 这时候面向对象就能帮上我们的忙了。1.1、类的定义我们先来处理一部分问题,也就是每个机枪兵独有的数据。class marinepublic $blood = 50; /剩余的血public $kills = 0; / 杀敌数量/这个函数(通常叫做)表示攻击敌人时候的运行代码function attack($enemy)/攻击敌人的代码这叫做类,我们建立了一个表示所有机枪兵的类兵独有的数据,比如上面代码里的剩余的血。1.2、对象的创建和使用marine,这里面保留了需要每个接下来我们来使用对象,也就是每个机枪兵:$m1 = new marine(); 通过 new 后面加一个类的名字和括号,我们新建了一个机枪兵$m1,$m1 被叫做类 marine 的对象,我们可以把它想象成一个特殊变量,只不过里面保存了多个数据。如果需要使用或者操作某个机枪兵的血(对象的属性),只要用$m1-blood 来表示就可以了:echo $m1-blood;我们再建立一个机枪兵$m2 = new marine();如果此时 $m1 被敌人攻击过了,还剩下10 个血。而 $m2 没受过攻击: echo $m1-blood;echo $m2-blood; /结果是 10 /结果是 50 /输出机枪兵 $m1 剩余的血使用对象可以很简单的保存每个机枪兵的血,不会互相影响。如果机枪兵 $m1 攻击敌人的时候,可以这样使用对象的方法:$m1-attack($z1); /假设攻击的是某个小狗的对象$z1不同的类内可以用同名的函数,比如小狗的类Zergling 里面也可以有一个函数attack.要注意的是,从 PHP5 开始,无论在哪里改变一个对象的属性,都能改变它。比如上面一个小狗对象被作为参数传入机枪兵的 attack 函数,执行函数之后这个小狗对象的血减少了,这和一般的函数不同。但这是很直观的,如果一个小狗被攻击了,它的血就应该减少。二、构造函数和析构函数每次我们新建一个机枪兵的时候,总人口应该加1,如果一个机枪兵被杀,人口应该减少 1。可以通过构造函数和析构函数来自动处理:class marine/构造函数function _construct()/析构函数function _destruct()在一个类中,名字为 _construct 的函数叫做构造函数,每次 new 新建一个类的对象的时候就会执行:$m1 = new marine(); /每次制造一个机枪兵时系统会调用类 marine 的构造函数,自动增加总人口在一个类中,名字为 _destruct的函数叫做析构函数,每次销毁一个类的对象的时候就会执行:unset($m1); /unset可以用于对象,表示销毁一个对象。每次一个机枪兵被杀时系统会调用类 marine的析构函数,自动减少总人口/减少总人口的代码/增加总人口的代码三、静态机枪兵的攻击力是属于所有机枪兵对象,每个机枪兵的攻击力都是一样的,如果升级,应该一起变化。这就用到 static,表示静态: class marinestatic $attackNumber = 10;静态属性表示类所有的对象都共享的属性,一旦改变,所有的对象都跟着变化。静态属性用 static 开头,比如上面的 static $attackNumber。静态属性可以用类直接访问: echo marine:$attackNumber; /显示 10如果类以内的函数访问,用 self:$attackNumber表示本类的 $attackNumber 属性 . 所以如果我们升级了机枪兵的攻击力,所有的机枪兵都受影响,这就是面向对象的好处之一,也解决了我们前面讨论的共同数据的问题。/攻击敌人的代码, $enemy-blood表示敌人对象的血属性 $enemy-blood -= self:$attackNumber; function attack($enemy) /攻击力的数字 /这个函数表示攻击敌人时候的运行代码函数也可以是静态的,这样就可以用类直接访问,不需要新建对象来调用:classmarinestatic $attackNumber = 10;static function upgrade()如果科技建筑升级完毕,直接就调用这个函数: marine:upgrade(); self:$attacknum+; /攻击力的数字 /这个函数表示机枪兵升级的运行代码四、继承兵营用来造机枪兵,坦克房用来制造坦克,他们都是建筑,但是却有很多不同,如果用一个类 “建筑 ”来表示,很困难。但我们要保留他们的共性,比如都能飞行,不希望飞行的代码在各个类重复写,又要让他们能各自独立的生产不同的东西。所以我们可以用继承来处理,继承表示父子关系,被继承的叫父类,继承的叫子类。用 extends表示继承 ./建筑类class buildingfunction fly()/兵营类class marineBuilding extends buildingfunction createMarine()/坦克房类class tankBuilding extends buildingfunction createTank()接下来,我们看看继承产生的效果:/如果造了一个兵营: $mb1 = new marineBuilding();/* 一旦他需要飞行,就可以直接使用建筑类的函数fly() ,尽管兵营类的定*/而他要制造机枪兵的时候:义里没有这个函数$mb1-fly(); / 制造坦克的代码/制造机枪兵的代码/建筑飞行的代码$mb1-createMarine();同样是继承建筑类的坦克房类,就无法制造机枪兵,因为这是兵营类的个性。如果在子类中的函数调用父类的函数,要使用parent,比如 parent:fly(). 注意,一个类只能有一个父类, PHP 不允许多重继承,也就是说一个孩子只能有一个爹,一个爹可以有 N 个孩子!五、访问控制如果用 $attackNumber = 10表示属性的话,系统默认是public $attackNumber =10,所以建议这样写:class marinepublic static $attackNumber = 10;public 表示这个属性是公共的,也就是在任何地方都可以访问和操作的。但这就存在一些问题,如果有玩家知道了类 marine 的一些代码结构,那他做个简单的补丁程序,运行的时候加载上去:/补丁marine:$attackNumber = 10000;这样的话,他的机枪兵有 10000 的攻击力,呵呵,这样的话,谁打得过他!为此我们要用 private,表示这个属性只有类里面的函数才能访问: class marineprivate static $attackNumber = 10;/这个函数表示机枪兵升级的运行代码function upgrade() /攻击力的数字 /攻击力的数字/这样防止无限升级if(self:$attacknumenergy -= 25;/新建一个机枪兵/显示攻击力为 10 echo $m1-attackNumber;/黑暗圣堂类class DarkTemplar extends concealAbility/新建一个鬼兵$g1 = new ghost();/显示能量为 150echo $g1-energy;/鬼兵隐形$g1-conceal();/显示能量为 125echo $g1-energy;/新建一个黑暗圣堂$d1 = new DarkTemplar();/黑暗圣堂隐形,他没有能量属性$g1-conceal();/这个函数表示隐形的运行代码function conceal() / 隐形的运行代码,不影响能量 七、接口PHP 不允许多重继承,那么有些问题就难办了。假如为了规范处理,我们把隐形的能力建立一个类,然后把飞行能力放一个类,那么人族的侦察机怎么处理?不能继承两个类!那我们不用继承也行,但是开发组的其他人一旦涉及到侦察机,要把长长的代码读一遍吗?有没有可能知道类的所有方法的简要描述?可以用到接口 interface,一个类可以执行(继承)多个接口,接口中定义的函数不能有函数体,执行接口的类必须将这些函数完整定义。这样我们知道侦察机实现了飞行能力接口,必然有接口里面描述的飞行方法:/隐形能力的接口interface concealAbilitypublic function conceal();/飞行能力的接口interface flyAbilitypublic function fly();/侦察机类class Wraith implements flyAbility, concealAbility/这个函数表示侦察机飞行的运行代码function fly() / 飞行的运行代码/这个函数表示侦察机隐形的运行代码function conceal()/隐形的运行代码八、总结我们讨论了 PHP面向对象的基本知识,通过星际争霸这一经典的游戏来说明,大家可以看到面向对象的初步作用。我们看到通过面向对象可以使代码更加清晰,类将代码组织起来,比较方便的重复使用。同时对象也减少了变量的冲突,方便相关性数据的保存和使用。如果要解决的问题涉及很多方面,面向对象可以演化出更加灵活和有技巧的方式,比如通常提到的设计模式,和很多框架。当然,面向对象也有缺点,从上面的代码可以看到,首先代码就多了,简单的任务如果定义许多类,反而麻烦。对于简单任务,面向对象也可能使代码运行的效率降低。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 各类标准


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!