当前位置 主页 > 网站技术 > 代码类 >

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

    栏目:代码类 时间:2020-01-23 15:06

    本文实例讲述了php面向对象基础。分享给大家供大家参考,具体如下:

    前言

    面向对象博大精深,对于从未接触过得的人,会觉得一头雾水。
    学习的资料很多,但大多比较抽象,所以我用经典的游戏-星际争霸来讨论PHP面向对象。
    现在假设我们来用PHP开发星际争霸,从而接触PHP面向对象。
    注意,为了便于学习,除了特殊说明,否则各部分代码之间没有关联。而且同一件事情往往用的是不同的代码。
    另外我也不去考证各个兵种的属性数字,仅仅用来说明。

    一、类和对象

    如果玩家制造了一个机枪兵,那么我们怎么表示他呢,因为每个机枪兵有几个基本的数据要记录:剩余的血,杀敌数量,攻击力等等。
    我们可以用一个数组来记录一个机枪兵剩余的血和杀敌数量,因为这对于每个机枪兵是独立的。
    但攻击力比较麻烦,因为经过升级,攻击力会增加,这就必须要找出所有表示机枪兵的数组,然后进行修改,非常麻烦。
    从这里我们可以看出一件事情,首先每个机枪兵有独立的数据需要记录和修改,比如剩余的血。同时他们有相同的数据需要共用,比如攻击力。
    这时候面向对象就能帮上我们的忙了。

    1.1、类的定义

    我们先来处理一部分问题,也就是每个机枪兵独有的数据。

    <?php 
      class marine
      {
        public $blood = 50; //剩余的血
        public $kills = 0; //杀敌数量
        //这个函数(通常叫做方法)表示攻击敌人时候的运行代码
        function attack($enemy)
        {
          //攻击敌人的代码
        }
      }
    ?>
    
    

    这叫做类,我们建立了一个表示所有机枪兵的类marine,这里面保留了需要每个兵独有的数据,比如上面代码里的剩余的血。

    1.2、对象的创建和使用

    接下来我们来使用对象,也就是每个机枪兵:

    <?php
      $m1 = new marine();
    ?>
    
    

    通过new后面加一个类的名字和括号,我们新建了一个机枪兵$m1,$m1被叫做类marine的对象,我们可以把它想象成一个特殊变量,只不过里面保存了多个数据。
    如果需要使用或者操作某个机枪兵的血(对象的属性),只要用$m1->blood来表示就可以了:echo $m1->blood;//输出机枪兵$m1剩余的血

    我们再建立一个机枪兵

    <?php 
      $m2 = new marine();
    ?>
    
    

    如果此时$m1被敌人攻击过了,还剩下10个血。而$m2没受过攻击:

    <?php
      echo $m1->blood;//结果是10
      echo $m2->blood;//结果是50
    ?>
    
    

    使用对象可以很简单的保存每个机枪兵的血,不会互相影响。
    如果机枪兵$m1攻击敌人的时候,可以这样使用对象的方法:

    <?php
      $m1->attack($z1);//假设攻击的是某个小狗的对象$z1
    ?>
    
    

    不同的类内可以用同名的函数,比如小狗的类Zergling里面也可以有一个函数attack
    要注意的是,从PHP5开始,无论在哪里改变一个对象的属性,都能改变它。比如上面一个小狗对象被作为参数传入机枪兵的attack函数,执行函数之后这个小狗对象的血减少了,这和一般的函数不同。但这是很直观的,如果一个小狗被攻击了,它的血就应该减少。

    二、构造函数和析构函数

    每次我们新建一个机枪兵的时候,总人口应该加1,如果一个机枪兵被杀,人口应该减少1。
    可以通过构造函数和析构函数来自动处理:

    <?php
      class marine
      {
        //构造函数
        function __construct()
        {
          //增加总人口的代码
        }
        //析构函数
        function __destruct()
        {
          //减少总人口的代码
        }
      }
    ?>