函数也可以是静态的,这样就可以用类直接访问,不需要新建对象来调用:
<?php class marine { static $attackNumber = 10; //攻击力的数字 //这个函数表示机枪兵升级的运行代码 staticfunction upgrade() { self::$attacknum++; } } ?>
如果科技建筑升级完毕,直接就调用这个函数:
<?php marine::upgrade(); ?>
四、继承
兵营用来造机枪兵,坦克房用来制造坦克,他们都是建筑,但是却有很多不同,如果用一个类“建筑”来表示,很困难。
但我们要保留他们的共性,比如都能飞行,不希望飞行的代码在各个类重复写,又要让他们能各自独立的生产不同的东西。
所以我们可以用继承来处理,继承表示父子关系,被继承的叫父类,继承的叫子类。用extends表示继承
<?php //建筑类 class building { function fly() { //建筑飞行的代码 } } //兵营类 class marineBuilding extends building { function createMarine() { //制造机枪兵的代码 } } //坦克房类 class tankBuilding extends building { function createTank() { //制造坦克的代码 } } ?>
接下来,我们看看继承产生的效果:
<?php //如果造了一个兵营: $mb1 = new marineBuilding(); //一旦他需要飞行,就可以直接使用建筑类的函数fly(),尽管兵营类的定义里没有这个函数 $mb1->fly(); //而他要制造机枪兵的时候: $mb1->createMarine(); ?>
同样是继承建筑类的坦克房类,就无法制造机枪兵,因为这是兵营类的个性。
如果在子类中的函数调用父类的函数,要使用parent,比如parent::fly()
注意,一个类只能有一个父类,PHP不允许多重继承,也就是说一个孩子只能有一个爹,一个爹可以有N个孩子!
五、访问控制
如果用$attackNumber = 10表示属性的话,系统默认是public $attackNumber = 10,所以建议这样写:
<?php class marine { public static $attackNumber = 10; //攻击力的数字 } ?>
public表示这个属性是公共的,也就是在任何地方都可以访问和操作的。
但这就存在一些问题,如果有玩家知道了类marine的一些代码结构,那他做个简单的补丁程序,运行的时候加载上去:
<?php //补丁 marine::$attackNumber = 10000; ?>
这样的话,他的机枪兵有10000的攻击力,呵呵,这样的话,谁打得过他!