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

为此我们要用private,表示这个属性只有类里面的函数才能访问:

<?php 
  class marine
  {
    private static $attackNumber = 10; //攻击力的数字
    //这个函数表示机枪兵升级的运行代码
    function upgrade()
    {
      //这样防止无限升级
      if(self::$attacknum<13)
      {
        self::$attacknum++;
      }
    }
  }
?>

这样一来,只有升级才能改变机枪兵的攻击力。
但是现在往往是团队开发,而且很多用到类的继承,如果private的话,子类就无法访问了,但又不希望随便都可以修改某些属性。
那么可以用protected,protected的属性可以被子类的函数访问。

六、重载

6.1、属性重载

如果我们把地面部队作为一个类,让机枪兵类来继承他,这时候如果地面部队类和机枪兵类里面都定义了攻击力$attackNumber,那么每个兵的攻击力就决定于机枪兵类,而不是地面部队。这就叫做重载。

<?php 
  //地面部队
  class groundArmy
  {
    public $attackNumber = 5;
  }
  //机枪兵
  class marine extends groundArmy
  {
    public $attackNumber = 10; //攻击力的数字
  }
  $m1 = new marine();//新建一个机枪兵
  echo $m1->attackNumber;//显示攻击力为10
?>

6.2、函数重载

重载也可以用于函数,子类的函数如果和父类函数同名,除非另行说明,否则子类的对象默认调用子类内的函数。
比如人族的鬼兵类ghost和神族类的黑暗圣堂类(隐刀),都是隐形兵种,但是鬼兵隐形的时候会减少能量,黑暗圣堂根本没有能量属性。
如果我们把隐形能力作为父类,鬼兵类ghost和神族类的黑暗圣堂类DarkTemplar来继承它,同时实现不同的隐形代码:

<?php
  //隐形能力类
  class concealAbility
  {
    //这个函数表示隐形的运行代码
    function conceal()
    {
      //隐形的运行代码
    }
  }
  //鬼兵类
  class ghost extends concealAbility
  {
    $energy = 150;
    //这个函数表示隐形的运行代码
    function conceal()
    {
      //隐形的运行代码
      //减少鬼兵的能量,$this表示当前对象,也就是当前这个鬼兵
      $this->energy -= 25;
    }
  }
  //黑暗圣堂类
  class DarkTemplar extends concealAbility
  {
    //这个函数表示隐形的运行代码
    function conceal()
    {
      //隐形的运行代码,不影响能量
    }
  }
  //新建一个鬼兵
  $g1 = new ghost();
  //显示能量为150
  echo $g1->energy;
  //鬼兵隐形
  $g1->conceal();
  //显示能量为125
  echo $g1->energy;
  //新建一个黑暗圣堂
  $d1 = new DarkTemplar();
  //黑暗圣堂隐形,他没有能量属性
  $g1->conceal();
?>

七、接口

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

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