php如何繼承父類別方法

2020-10-07 18:00:52

php繼承父類別方法:使用Student類繼承Person類,程式碼為【class Student extends Person{private $school;function __construct($name="",$sex="男"}】。

php繼承父類別方法:

在PHP中不能定義重名的函數,也包括不能再同一個類中定義重名的方法,所以也就沒有方法過載。單在子類中可以定義和父類別重名的方法,因為父類別的方法已經在子類中存在,這樣在子類中就可以把從父類別中繼承過來的方法重寫。

子類中過載父類別的方法就是在子類中覆蓋從父類別中繼承過來的方法,父類別中的方法被子類繼承過來不就可以直接使用嗎?為什麼還要過載呢?因為有一些情況我們必須要覆蓋的。例如,有一個「鳥」類,在這個類中定義了鳥的通用方法「飛翔」。將「鴕鳥」類作為它的子類,就會將「飛翔」的方法繼承過來,但只要一呼叫「鴕鳥」類中的這個「飛翔」的方法,鴕鳥就會飛走。雖然鴕鳥是不會飛的,但其他特性都具有「鳥類」的特性,所以在宣告「鴕鳥」類時還是可以繼承「鳥」類的,但必須在「鴕鳥」類中將「鳥」類中繼承過來的「飛翔」方法改寫,就需要在子類中過載父類別中的方法。

在下面的例子中,宣告的Person類中有一個「說話」方法,Student類繼承Person類後可以直接使用「說話」方法。但Person類中的「說話」方法只能說出它自己的成員屬性,而Student類對Person類進行了擴充套件,多新增了幾個新的成員屬性。程式碼如下所示:

<?php
class Person{
protected $name;
protected $sex;
protected $Wage;
function __construct($name="",$sex="男",$age=1){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
}
//在人類中宣告一個通用的說話方法,介紹一下自己
function say(){
echo "我的名字:".$this-> name.",性別:".$this ->sex.",年齡:".$this ->age."。<br>";
}
}
//宣告一個學生類,使用extends關鍵字擴充套件(繼承)person類
class Student extends Person {
private $school; //在學生類中宣告一個所在學校school的成員屬性
//覆蓋父類別中的構造方法,在參數列中新增一個學校屬性,用來建立物件並初始化成員屬性
function __construct($name="",$sex="男",$age=1,$school=""){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
$this ->school = $school;
}
function study(){
echo $this ->name."正在".$this ->school."學習<br>";
}
//定義一個和父類別中同名的方法,將父類別中的說話方法覆蓋並重寫,多說出所在的學校名稱
function say(){
echo "我的名字:".$this ->name.",性別:".$this ->sex.",年齡:".$this ->age.",在".$this ->school."學校上學<br>";
}
}
$student= new Student("張三","男",20,"edu"); //建立一個學生物件,並傳給一個學校名稱引數
$student -> say(); //呼叫學生類中覆蓋父類別的說話方法
?>

改程式執行後輸出的結果為:

我的名字叫:張三,性別:男,我的年齡是:20,在..學校上學

在PHP中,提供了在子類過載的方法中呼叫父類別被覆蓋方法的功能。這樣就可以在子類重寫的方法中,繼續使用從父類別繼承過來並被覆蓋的方法,然後再按要求多新增一些新功能。呼叫的格式是使用「parent:方法名」在子類的過載方法中呼叫父類別中被覆蓋的方法。將上例中的程式碼修改一下,在子類重寫的構造方法中使用「parent::__construct()」呼叫父類別中被覆蓋的構造方法,再多新增一條對子類中新擴充套件的成員屬性初始化的程式碼。在子類中重寫的say()方法中使用「parent::say()」呼叫父類別中被覆蓋的say()方法,再新增上輸出子類成員屬性的功能。

程式碼如下所示:

<?php
class Person{
protected $name;
protected $sex;
protected $Wage;
function __construct($name="",$sex="男",$age=1){
$this ->name = $name;
$this ->sex = $sex;
$this ->age = $age;
}
//在人類中宣告一個通用的說話方法,介紹一下自己
function say(){
echo "我的名字:".$this-> name.",性別:".$this ->sex.",年齡:".$this ->age."。<br>";
}
}
//宣告一個學生類,使用extends關鍵字擴充套件(繼承)person類
class Student extends Person {
private $school; //在學生類中宣告一個所在學校school的成員屬性
//覆蓋父類別中的構造方法,在參數列中新增一個學校屬性,用來建立物件並初始化成員屬性
function __construct($name="",$sex="男",$age=1,$school=""){
//呼叫父類別中被覆蓋的構造方法,為從父類別中整合過來額出行賦初值
parent::__construct($name,$sex,$age);
$this ->school = $school;
}
function study(){
echo $this ->name."正在".$this ->school."學習<br>";
}
//定義一個和父類別中同名的方法,將父類別中的說話方法覆蓋並重寫,多說出所在的學校名稱
function say(){
parent::say(); //呼叫父類別中被本方法覆蓋掉的方法
echo "在".$this ->school."學校上學<br>";
}
}
$student= new Student("張三","男",20,"edu"); //建立一個學生物件,並傳給一個學校名稱引數
$student -> say(); //呼叫學生類中覆蓋父類別的說話方法
?>

上面的例子輸出的結果和前一個例子是一樣的,但在本例中通過在子類中直接呼叫父類別中被覆蓋的方法要簡便很多。另外,在子類覆蓋父類別的方法時一定要注意,在子類中重寫的方法存取許可權一定不能低於父類別被覆蓋的方法的存取許可權。例如,如果父類別中的存取許可權是protected,那麼在子類中重寫的方法的許可權就要是protected或public。

相關免費學習推薦:(視訊)

以上就是php如何繼承父類別方法的詳細內容,更多請關注TW511.COM其它相關文章!