亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > php面向對象基礎詳解【星際爭霸游戲案例】

php面向對象基礎詳解【星際爭霸游戲案例】

熱門標簽:騰訊外呼管理系統 昭通辦理400電話 山西回撥外呼系統 岳陽外呼型呼叫中心系統在哪里 百應電話機器人服務 揚州地圖標注app 青島語音外呼系統招商 山西探意電話機器人 河南電銷卡外呼系統哪家強

本文實例講述了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()
    {
      //減少總人口的代碼
    }
  }
?>

在一個類中,名字為__construct的函數叫做構造函數,每次new新建一個類的對象的時候就會執行:

?php
  $m1 = new marine();//每次制造一個機槍兵時系統會調用類marine的構造函數,自動增加總人口
?>

在一個類中,名字為__destruct的函數叫做析構函數,每次銷毀一個類的對象的時候就會執行:

?php
  unset($m1);//unset可以用于對象,表示銷毀一個對象。每次一個機槍兵被殺時系統會調用類marine的析構函數,自動減少總人口
?>

三、靜態

機槍兵的攻擊力是屬于所有機槍兵對象,每個機槍兵的攻擊力都是一樣的,如果升級,應該一起變化。
這就用到static,表示靜態:

?php
  class marine
  {
    static $attackNumber = 10; //攻擊力的數字
    //這個函數表示攻擊敵人時候的運行代碼
    function attack($enemy)
    {
      //攻擊敵人的代碼,$enemy->blood表示敵人對象的血屬性
      $enemy->blood -= self::$attackNumber;
    }
  }
?>

靜態屬性表示類所有的對象都共享的屬性,一旦改變,所有的對象都跟著變化。
靜態屬性用static開頭,比如上面的static $attackNumber。
靜態屬性可以用類直接訪問:

?php
  echo marine::$attackNumber;//顯示10
?>

如果類以內的函數訪問,用self::$attackNumber表示本類的$attackNumber屬性
所以如果我們升級了機槍兵的攻擊力,所有的機槍兵都受影響,這就是面向對象的好處之一,也解決了我們前面討論的共同數據的問題。

函數也可以是靜態的,這樣就可以用類直接訪問,不需要新建對象來調用:

?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的攻擊力,呵呵,這樣的話,誰打得過他!

為此我們要用private,表示這個屬性只有類里面的函數才能訪問:

?php 
  class marine
  {
    private static $attackNumber = 10; //攻擊力的數字
    //這個函數表示機槍兵升級的運行代碼
    function upgrade()
    {
      //這樣防止無限升級
      if(self::$attacknum13)
      {
        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();
?>

七、接口

PHP不允許多重繼承,那么有些問題就難辦了。
假如為了規范處理,我們把隱形的能力建立一個類,然后把飛行能力放一個類,那么人族的偵察機怎么處理?不能繼承兩個類!
那我們不用繼承也行,但是開發組的其他人一旦涉及到偵察機,要把長長的代碼讀一遍嗎?有沒有可能知道類的所有方法的簡要描述?
可以用到接口interface,一個類可以執行(繼承)多個接口,接口中定義的函數不能有函數體,執行接口的類必須將這些函數完整定義。
這樣我們知道偵察機實現了飛行能力接口,必然有接口里面描述的飛行方法://隱形能力的接口

?php 
  interface concealAbility
  {
    public function conceal();
  }
  //飛行能力的接口
  interface flyAbility
  {
    public function fly();
  }
  //偵察機類
  class Wraith implements flyAbility, concealAbility
  {
    //這個函數表示偵察機飛行的運行代碼
    function fly()
    {
      //飛行的運行代碼
    }
    //這個函數表示偵察機隱形的運行代碼
    function conceal()
    {
      //隱形的運行代碼
    }
  }
?>

八、總結

我們討論了PHP面向對象的基本知識,通過星際爭霸這一經典的游戲來說明,大家可以看到面向對象的初步作用。
我們看到通過面向對象可以使代碼更加清晰,類將代碼組織起來,比較方便的重復使用。
同時對象也減少了變量的沖突,方便相關性數據的保存和使用。
如果要解決的問題涉及很多方面,面向對象可以演化出更加靈活和有技巧的方式,比如通常提到的設計模式,和很多框架。
當然,面向對象也有缺點,從上面的代碼可以看到,首先代碼就多了,簡單的任務如果定義許多類,反而麻煩。
對于簡單任務,面向對象也可能使代碼運行的效率降低。
深入的探討,超出了本文的范圍。

更多關于PHP相關內容感興趣的讀者可查看本站專題:《php面向對象程序設計入門教程》、《PHP數組(Array)操作技巧大全》、《PHP基本語法入門教程》、《PHP運算與運算符用法總結》、《php字符串(string)用法總結》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》

希望本文所述對大家PHP程序設計有所幫助。

您可能感興趣的文章:
  • php設計模式 Builder(建造者模式)
  • 學習php設計模式 php實現建造者模式
  • PHP設計模式之建造者模式定義與用法簡單示例
  • PHP設計模式之建造者模式(Builder)原理與用法案例詳解
  • php設計模式之抽象工廠模式分析【星際爭霸游戲案例】
  • php設計模式之工廠方法模式分析【星際爭霸游戲案例】
  • PHP設計模式之觀察者模式(Observer)詳細介紹和代碼實例
  • php設計模式 Template (模板模式)
  • php設計模式 DAO(數據訪問對象模式)
  • php設計模式 Proxy (代理模式)
  • php設計模式之建造器模式分析【星際爭霸游戲案例】

標簽:宜賓 南陽 銅川 湛江 黃南 寶雞 婁底 鎮江

巨人網絡通訊聲明:本文標題《php面向對象基礎詳解【星際爭霸游戲案例】》,本文關鍵詞  php,面向,對象,基礎,詳解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《php面向對象基礎詳解【星際爭霸游戲案例】》相關的同類信息!
  • 本頁收集關于php面向對象基礎詳解【星際爭霸游戲案例】的相關信息資訊供網民參考!
  • 推薦文章
    亚洲精品久久久中文字| 国产网站麻豆精品视频| 国产一区二区精品久| 日日日夜夜操| 国产欧美精品| 天天色色色| 国产韩国精品一区二区三区| 欧美国产日韩精品| 成人免费网站视频ww| 亚洲wwwwww| 国产福利免费观看| 日本特黄特色aaa大片免费| 久久国产影院| 四虎影视精品永久免费网站| 成人在激情在线视频| 一本高清在线| 999久久狠狠免费精品| 午夜久久网| 亚洲天堂在线播放| 国产一区二区精品| 久久福利影视| 欧美另类videosbestsex高清| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 青草国产在线观看| 黄视频网站免费观看| 日韩av东京社区男人的天堂| 欧美爱爱动态| 久草免费资源| 欧美激情一区二区三区视频| 精品美女| 久久国产精品自由自在| 你懂的日韩| 亚洲 欧美 91| 午夜欧美福利| 中文字幕一区二区三区精彩视频 | 欧美国产日韩精品| 日本特黄特色aaa大片免费| a级毛片免费观看网站| 亚洲精品久久久中文字| 国产国语对白一级毛片| 国产一级强片在线观看| 精品国产一区二区三区免费| 久草免费在线色站| 欧美国产日韩精品| 亚欧视频在线| 国产伦精品一区二区三区无广告| 国产一区二区福利久久| 99久久精品国产国产毛片| 天天做人人爱夜夜爽2020| 久久99青青久久99久久| 亚洲爆爽| 国产91素人搭讪系列天堂| 国产91素人搭讪系列天堂| 日韩中文字幕一区| 九九国产| 久久99这里只有精品国产| 99久久精品国产高清一区二区 | 999精品在线| 国产伦精品一区三区视频| 韩国三级视频网站| 99色精品| 久久国产精品自由自在| 国产福利免费观看| 欧美日本韩国| 国产不卡精品一区二区三区| 可以免费看污视频的网站| 国产一级强片在线观看| 国产激情一区二区三区| 九九精品在线播放| 国产伦理精品| 久久国产精品只做精品| 国产网站在线| 国产一区免费观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 中文字幕97| 亚洲第一页乱| 国产伦精品一区三区视频| 国产视频久久久| 欧美激情一区二区三区在线| 香蕉视频亚洲一级| 香蕉视频久久| 日本乱中文字幕系列| 国产91素人搭讪系列天堂| 中文字幕97| 精品久久久久久中文字幕2017| 成人免费一级毛片在线播放视频| 日韩avdvd| 九九久久国产精品| 九九国产| 色综合久久天天综合观看| 欧美国产日韩在线| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 香蕉视频亚洲一级| 精品国产一区二区三区国产馆| 一本高清在线| 九九久久国产精品| 毛片高清| 国产视频一区二区在线观看| 欧美1卡一卡二卡三新区| 欧美a免费| 欧美另类videosbestsex视频| 国产欧美精品| 久久99这里只有精品国产| 日韩免费在线观看视频| 韩国三级视频在线观看| 国产不卡福利| 一级女性全黄生活片免费| 日本特黄特色aaa大片免费| 亚洲第一页乱| 一级女性全黄生活片免费| 午夜精品国产自在现线拍| 国产福利免费观看| 高清一级毛片一本到免费观看| 午夜激情视频在线播放| 色综合久久天天综线观看| a级黄色毛片免费播放视频| 四虎影视精品永久免费网站| 成人影院久久久久久影院| 国产一区二区精品尤物| 国产精品1024永久免费视频| 国产网站免费视频| 人人干人人插| 91麻豆tv| 沈樵在线观看福利| 国产原创视频在线| 99热热久久| 国产网站麻豆精品视频| 久久国产精品自由自在| 国产欧美精品| 精品国产香蕉在线播出| 韩国毛片免费| 沈樵在线观看福利| 国产伦久视频免费观看 视频| 日韩男人天堂| 午夜在线亚洲| 日韩专区一区| 天天做日日爱| 日韩一级黄色| 国产一区二区精品久久91| 在线观看导航| 韩国毛片免费| 午夜精品国产自在现线拍| 美国一区二区三区| 日本乱中文字幕系列| 99久久精品国产高清一区二区 | 欧美爱爱动态| 国产麻豆精品| 日韩一级黄色| 国产激情一区二区三区| 青青久热| 精品久久久久久影院免费| 成人免费高清视频| 日本免费看视频| 成人免费网站视频ww| 高清一级毛片一本到免费观看| 一级毛片视频在线观看| 国产高清视频免费| 日韩中文字幕一区| 四虎影视精品永久免费网站| 欧美激情一区二区三区中文字幕| 可以在线看黄的网站| 九九热国产视频| 99热精品在线| 沈樵在线观看福利| 精品国产一区二区三区国产馆| 亚洲天堂免费观看| 久久久成人网| 欧美激情一区二区三区视频| 日韩男人天堂| 99热精品在线| 日本伦理片网站| 亚洲 男人 天堂| 久久福利影视| 国产欧美精品| 韩国三级视频在线观看| 成人免费一级毛片在线播放视频| 欧美激情一区二区三区视频| 国产国语对白一级毛片| 亚洲精品永久一区| 久久国产一久久高清| 精品国产一区二区三区免费| 成人a级高清视频在线观看| 国产国语对白一级毛片| 国产一区二区精品久久91| 欧美激情一区二区三区中文字幕| 四虎影视久久久免费| 99热热久久| 可以免费看污视频的网站| 国产a视频| 国产视频久久久| 国产综合成人观看在线| 一级毛片视频在线观看| 99热热久久| 韩国三级视频在线观看| 可以免费看污视频的网站| 成人影院久久久久久影院| 国产综合成人观看在线| 青青久热| 美女免费精品视频在线观看| 人人干人人插|