最近開始從新學習對象知識,其實也算是初步深刻學習對象和設計模式,但願本身會堅持下去,保持更新php
還記得,剛開始學習 PHP 的時候,學到到方法和對象時有一個很大的疑問,對象與方法相比較那麼麻煩(須要設置屬性,給屬性賦值,實例化類,調用)爲何還要用對象呢?隨着逐步的深刻才發現,本身以前的想法是有多好笑,下面給一個簡單的示例。設計模式
function get_max($val_1, $val_2) { return $val_1 > $val_2 ? $val_1 : $val_2; } $max = get_max(23,34); echo $max; echo '<br>======================這是華麗的分隔符======================<br>'; // 類 class Test { // 屬性 public $val_1; public $val_2; // 類的方法 public function __construct($val_1, $val_2) { $this->val_1 = $val_1; $this->val_2 = $val_2; } public function get_max() { return $this->val_1 > $this->val_2 ? $this->val_1 : $this->val_2; } } // 實例化類,$test 是由類 Test 生成的對象 $test = new Test(83, 34); echo $test->get_max();
能夠看到使用對象比單純的方法多了不少代碼,可是爲何還要使用對象呢,咱們下一節詳細介紹,別走開,往下看安全
什麼是對象?什麼是類?不少人會把兩個搞混淆,咱們能夠把類看作一個工廠,產出的產品就是對象,也就是對象是類的實現。學習
一個類一般包含屬性、方法。舉個🌰:有一個生產麪包的機器(類),生成麪包須要一些材料(屬性),材料包含麪粉、雞蛋、水(不熟悉)。有了材料就能夠運做生成麪包了,這時機器會把準備好的材料放一塊兒處理(方法)生成麪包。測試
關鍵字也是很重要的概念,用來決定聲明的屬性或方法的可見性,包含: public、protected、private。一個屬性或方法設置爲 public 就表明不管在對象內仍是對象外均可以被使用,好比麪包機裏若是有一個攪拌機(僅限若是),若是這個攪拌機設置爲public,則這個攪拌機能夠被任何品牌的麪包機使用。若是設置爲 protected,則只能在同品牌的麪包機中使用(繼承的類)。若是設置爲private則只能被本身用。網站
回到上節問題,對比方法,問什麼使用對象?由於方便,沒錯真的方便。由於對象有如下幾個特色:this
封裝:顧名思義,就是把類的屬性和方法封裝起來,設置權限(public|protected|private),以下:設計
class Test { public $val_1; protected $val_2; public function __construct($val_1, $val_2) { $this->val_1 = $val_1; $this->val_2 = $val_2; } protected function get_max() { return $this->val_1 > $this->val_2 ? $this->val_1 : $this->val_2; } } $test = new Test(83, 34); echo $test->get_max();
封裝的好處是安全、可控。
以上代碼由於引用了 protected 聲明的方法,所以會報以下的錯誤
Fatal error: Uncaught Error: Call to protected method StudyDesignMode\Test::get_max() from context '' in ...code
一樣顧名思義,就是繼承分類的方法或屬性,只能繼承 public | protected 關鍵字聲明的方法或屬性。繼承的主要做用是多個不一樣的類都須要一樣的一個方法,可使用繼承。好比多個網站頁面(每一個頁面都是單獨的類)都須要驗證是否登陸,這時候能夠定義一個父類,裏面驗證是否登陸,再由須要驗證登陸的類繼承,這樣就不須要每一個類都寫一次驗證。對象
class Test { private $val_1; private $val_2; protected function set_value($val_1, $val_2) { $this->val_1 = $val_1; $this->val_2 = $val_2; } protected function getMax() { return $this->val_1 > $this->val_2 ? $this->val_1 : $this->val_2; } protected function getMin() { return $this->val_1 > $this->val_2 ? $this->val_2 : $this->val_1; } } class TestSub extends Test { public function __construct($val_1, $val_2) { $this->set_value($val_1, $val_2); } // 簡單功能測試 public function printMaxValue() { echo $this->getMax(); } public function printMinValue() { echo $this->getMin(); } } $test = new TestSub(83, 34); echo '<br>======================這是華麗的分隔符 獲取最大值======================<br>'; echo $test->printMaxValue(); echo '<br>======================這是華麗的分隔符 獲取最小值======================<br>'; echo $test->printMinValue();
結果:
======================這是華麗的分隔符 獲取最大值======================
83
======================這是華麗的分隔符 獲取最小值======================
34
就是讓具備繼承關係的不一樣類對象重寫類中的方法(兩個類中有相同名稱的方法),典型的應用是抽象類(abstract)和接口類(interface)。以下:
abstract class Vehicle { abstract public function run(); } class Car extends Vehicle { public function run() { echo '速度100'; } } class Bicycle extends Vehicle { public function run() { echo '速度15'; } } $car = new Car(); echo $car->run(); echo '<br>======================這是華麗的分隔符======================<br>'; $bicycle = new Bicycle(); echo $bicycle->run();
結果: 速度100 ======================這是華麗的分隔符====================== 速度15