php面向对象基础详解【星际争霸游戏案例】(3)

函数也可以是静态的,这样就可以用类直接访问,不需要新建对象来调用:

<?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的攻击力,呵呵,这样的话,谁打得过他!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1856.html