PHP 對象基礎知識


最近開始重新學習對象知識,其實也算是初步深入學習對象和設計模式,希望自己會堅持下去,保持更新

初識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則只能被自己用。

回到上節問題,對比方法,問什么使用對象?因為方便,沒錯真的方便。因為對象有以下幾個特點:

  • 封裝性
  • 繼承
  • 多態

封裝性

封裝:顧名思義,就是把類的屬性和方法封裝起來,設置權限(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 ...

繼承

同樣顧名思義,就是繼承分類的方法或屬性,只能繼承 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM