1. 程式人生 > >php面向物件之重寫(override)

php面向物件之重寫(override)

什麼叫重寫?

重寫,其實就是子類重新定義父類繼承給自己的屬性或者方法。

基本特徵

父類已經有的屬性或方法,子類用同樣的名字再定義一次。

為什麼要重寫?

通常,子類的特徵資訊的定義,都應該是比父類更為“詳細”,其表現在兩個方面:

1、父類沒有的,子類可以有;(注意:新增特徵資訊是擴充套件,不是重寫)

2、父類有的,子類也可以有,但子類會定義得“自認為”更為細緻或者準確,這就是重寫

如果從父類繼承的成員不能滿足子類的需求,可以對其進行改寫,這個過程稱為重寫(override),也叫覆蓋。 

因為PHP是弱型別的語言, 所以在方法的引數中本身就可以接收不同型別的資料,又因為PHP的方法可以接收不定個數的引數,所以通過傳遞不同個數的引數呼叫不相同方法名的不同方法也是不成立的(這點和java不同)。

注意,在程式語言中,php的過載要和其他語言的過載區別開來;在php中,重寫要和過載區分開來;

定義一個動物類,然後定義兩個子類小雞類和羊駝類演示一下,程式碼才是檢驗真理的唯一標準

<?php

//定義一個動物類
class animal {
    public $weight = 0;

    public function eating()
    {
        echo "動物正在吃東西";
    }
}

class alpaca extends animal {
    public $weight = 20; //覆蓋了父類的屬性

    //覆蓋了父類的方法
    public function eating()
    {
        echo '羊駝正在吃東西'.PHP_EOL;
        $this->weight +=5;
    }
}

class chicken extends animal {

    //覆蓋了父類的方法
    public function eating()
    {
        echo '小雞在吃東西'.PHP_EOL;
        $this->weight ++;
    }
}

$alpaca = new alpaca();
$alpaca->eating();
$alpaca->eating();
echo '羊駝的體重是:'.$alpaca->weight.PHP_EOL;
$chicken = new chicken();
$chicken->eating();
$chicken->eating();
echo '小雞的體重是:'.$chicken->weight.PHP_EOL;

重寫的注意項

1、子類只能放大許可權,不能縮小許可權。

2、對於方法的重寫,要求方法的形參必須和父類的形引數量一一對應(在php中,不對應不會報錯,但是程式碼不建議你這樣做)。

3、對於構造方法,沒有形參要求。

4、對於父類私有的成員方法,雖然沒繼承(也有一說,繼承過來了,但是不能訪問),但是也必須保持形引數量一一對應