引言
大家都在說編程中一定要使用面向物件,但是我一直不太懂面向物件到底是個啥玩意?經過我不懈努力的研究,我終于簡單的明白了面向物件的是個啥玩意,
面向物件是一種編程思想,這種編程思想一旦掌握,對開發都有巨大的好處,再說面向物件之前,我們先來看下面向程序是啥
面向程序
啥叫面向程序捏,面向程序就是根據具體需求,寫具體的代碼,
舉個荔枝
計算50+33的值
$sum = 50 + 33; echo $sum;
上述例子就是一個簡單的面向程序的荔枝,它的優點 :能根據具體需求,快速寫出具體代碼;性能能比面向物件高;但是缺點也非常明顯:功能單一化,難以擴展,無法復用,不利于維護;
所以說面向程序的編程思想僅限于具體、簡單且將來不會有進行擴展或者維護需求的代碼開發,
面向物件
說完了面向程序,那咱現在說一說面向物件,剛才說了那么多面向程序的優缺點,但是面向程序編程思想的缺點大于優點,既然有面向物件這種編程思想,本著存在即合理的看法,那想必面向物件肯定比面向程序好很多吧,
那么面向物件編程思想到底是個啥呢,這個我恐怕一時半會說不清楚,咱們直接上代碼
繼續那個計算50+33的值荔枝
第一步 說要求50+33的值是多少,那想必這肯定是一個在計算器中進行計算的,所以我們第一步就是要創建一個計算器類,創建這個類之前,需要想一想有哪些成員屬性,有哪些成員方法等,在這個計算器類中存在著兩個私有屬性的數字變數和獲取和設定這兩個變數的成員方法和計算這兩個變數指的計算方法
class calculator { // get|set // private $num1; private $num1; private $num2; // 計算方法 public function computer($strOperate) { /** * 如果我們需要的這個計算的值,不固定隨便改,隨便傳入 * 并且還有內容設定 1 》 100 * @var integer */ // $num1 = 50; // 第一個值起作用 $this->setNum1(50); $this->setNum2(533); $strResult = ""; switch ($strOperate) { case '+': // 加法操作的引數有要求 // 只允許1 到 100 計算范圍 if ($this->num1) { // code... } else { // code... } // 代碼最精簡 100多行 $strResult = $this->num1 + $this->num2; if ($this->num1) { // code... } else { // code... } // $strResult小于 0 不允許回傳 0 break; case '-': $strResult = $this->num1 - $this->num2; break; case '*': $strResult = $this->num1 * $this->num2; break; case '/': $strResult = $this->num1 / $this->num2; break; } } // 創建四個方法 分別是 加法.... // 設定$num1值 public function setNum1($num1='') { if($num1 > 100 and $num1< 999){ $this->num1 = $num1; } else{ $this->num1 = 0; } // if ($num1 > 100 and $num1< 999) { // return $num1; // } else { // return 0; // } } public function getNum1() { return $this->num1; } public function getNum2() { return $this->num2; } public function setNum2($num2='') { if ($num2 < 0) { $this->num2 = $num2; } $this->num2 = 0; } }
第二步 創建一個客戶端類,這個類主要就是做寫入資料和計算符號,并獲得相關結果
//引入計算器類檔案 require 'Calcuate.php' class Client {
public function index()
{ $calcuate = new Calcuate(); $calcuate->setNumA(50); $calcuate->setNumB(33); return $calcuate->compute('+');
} }
從上述荔枝可以看出,面向物件優點是擴展性好,復用率高,維護方便,代碼超少,但是缺點就是該編程思想過于抽象,不太好掌握
那么怎樣才能擁有面向物件的編程思想呢?下圖就是實作面向物件編程思想的思路

1.先通過面向程序實作相關業務
2.在思考創建相關業務共同的相同的地方并且創建這樣一個類
3.思考這個類中有哪些成員屬性和成員方法
4.思考基于這個類與其他類之間的關系,主要指的是物件與物件之間的關系
5.實體化并呼叫該類中的屬性或者方法即可;
優化重構
從上述荔枝中可以看出,雖然已經基于面向物件的編程思想實作相關代碼,但是相關類還略顯臃腫,若要進行擴展和維護也是比較難的,所以我們需要重構,為將來的擴展和維護做好準備,
abstract class Operate { protected $numA; protected $numB;
public function setNumA($num) { $this->numA = $num; } public function setNumB($num) { $this->numB = $num; } public function getNumA() { return $this->numA; } public function getNumB() { return $this->numB; } //抽象方法創建的原則 : 1.子類共用 2. 子類一定會重寫 abstract public function compute(); }
class Sum extends Operate { public function compute() { return $this->numA + $this->numB; } }
class Div extends Operate { public function compute() { return $this->numA / $this->numB; } }
class Mul extends Operate { public function compute() { return $this->numA * $this->numB; } }
// 減法類 class OperationSub extends Operation { ## 實作父類的計算方法 public function GEtResult() { $result = $this->numA - $this->numB; return $result; } }
// 簡單運算工廠類 class OperationFactory { ## 根據需求創建對應的工廠類 public static function createOperate($operate) { $oper = null; switch ($operate) { case '+': $oper = new OperationAdd(); break; case '-': $oper = new OperationSub(); break; case '*': $oper = new OperationMul(); break; case '/': $oper = new OperationDiv(); break; } return $oper; } }
// 客服端 class Client { public function index() { $numA = $_POST["numA"]; $numB = $_POST["numB"]; $strOperate = $_POST["strOperate"]; ## 創建對應的計算類 $oper = OperationFactory::createOperate($strOperate); $oper->setNumA($numA); $oper->setNumB($numB); $strResult = $oper->GEtResult(); echo "結果是".$strResult; } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/136634.html
標籤:PHP
