|
在學(xué)習(xí)php 這種語言中你會(huì)發(fā)現(xiàn),php 中的方法是不能重載的,所謂的方法重載就是
定義相同的方法名,通過“參數(shù)的個(gè)數(shù)”不同或“參數(shù)的類型”不同,來訪問我們的相同方法
名的不同方法。但是因?yàn)?a href=/itjie/phpjishu/ target=_blank class=infotextkey>php 是弱類型的語言,所以在方法的參數(shù)中本身就可以接收不同類
型的數(shù)據(jù),又因?yàn)?a href=/itjie/phpjishu/ target=_blank class=infotextkey>php 的方法可以接收不定個(gè)數(shù)的參數(shù),所以通過傳遞不同個(gè)數(shù)的參數(shù)調(diào)用
不相同方法名的不同方法也是不成立的。所以在php 里面沒有方法重載。不能重載也就是在
你的項(xiàng)目中不能定義相同方法名的方法。另外,因?yàn)?a href=/itjie/phpjishu/ target=_blank class=infotextkey>php 沒有名子空間的概念,在同一個(gè)頁
面和被包含的頁面中不能定義相同名稱的方法,也不能定義和php 給我提供的方法重名,當(dāng)
然在同一個(gè)類中也不能定義相同名稱的方法。
我們這里所指的重載新的方法所指的是什么呢?其實(shí)我們所說的重載新的方法就是子類
覆蓋父類的已有的方法,那為什么要這么做呢?父類的方法不是可以繼承過來直接用嗎?但
有一些情況是我們必須要覆蓋的,比如說我們前面提到過的例子里面,“Person”這個(gè)人類里
面有一個(gè)“說話”的方法,所有繼承“Person”類的子類都是可以“說話”的,我們“Student”
類就是“Person”類的子類,所以“Student”的實(shí)例就可以“說話”了,但是人類里面“說
話”的方法里面說出的是“Person”類里面的屬性,而“Student”類對(duì)“Person”類進(jìn)行了擴(kuò)
展,又?jǐn)U展出了幾個(gè)新的屬性,如果使用繼承過來的“say()”說話方法的話,只能說出從
“Person”類繼承過來的那些屬性,那么新擴(kuò)展的那些屬性使用這個(gè)繼承過來的“say()”的
方法就說不出來了,那有的人就問了,我在“Student”這個(gè)子類中再定義一個(gè)新的方法用于
說話,說出子類里面所有的屬性不就行了嗎?一定不要這么做,從抽象的角度來講,一個(gè)“學(xué)
生”不能有兩種“說話”的方法,就算你定義了兩個(gè)不同的說話的方法,可以實(shí)現(xiàn)你想要的
功能,被繼承過來的那個(gè)“說話“方法可能沒有機(jī)會(huì)用到了,而且是繼承過來的你也刪不掉。
這個(gè)時(shí)候我們就要用到覆蓋了。
雖然說在php 里面不能定義同名的方法,但是在父子關(guān)系的兩個(gè)類中,我們可以在子類
中定義和父類同名的方法,這樣就把父類中繼承過來的方法覆蓋掉了。
代碼片段
復(fù)制代碼 代碼如下:
<?
//定義一個(gè)“人”類做為父類
class Person{
//下面是人的成員屬性
var $name; //人的名子
var $sex; //人的性別
var $age; //人的年齡
//定義一個(gè)構(gòu)造方法參數(shù)為屬性姓名$name、性別$sex和年齡$age進(jìn)行賦值
function __construct($name, $sex, $age){
$this->name=$name;
$this->sex=$sex;
$this->age=$age;
}
//這個(gè)人可以說話的方法, 說出自己的屬性
function say() {
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."<br>";
}
}
class Student extends Person
{
var $school; //學(xué)生所在學(xué)校的屬性
//這個(gè)學(xué)生學(xué)習(xí)的方法
function study() {
echo "我的名子叫:".$this->name." 我正在”.$this->school.”學(xué)習(xí)<br>";
}
//這個(gè)學(xué)性可以說話的方法, 說出自己所有的屬性,覆蓋了父類的同名方法
function say() {
echo "我的名子叫:".$this->name." 性別:".$this->sex." 我的年齡是:".$this->age."我在
".$this->school."上學(xué).<br>";
}
}
?>
上面的例子,我們就在“Student”子類里覆蓋了繼承父類里面的“say()”的方法,通過
覆蓋我們就實(shí)現(xiàn)了對(duì)“方法”擴(kuò)展。
但是,像這樣做雖然解決了我們上面說的問題,但是在實(shí)際開發(fā)中,一個(gè)方法不可能就
一條代碼或是幾條代碼,比如說“Person”類里面的“say()”方法有里面有100 條代碼,如
果我們想對(duì)這個(gè)方法覆蓋保留原有的功能外加上一點(diǎn)點(diǎn)功能,就要把原有的100 條代碼重寫
一次,再加上擴(kuò)展的幾條代碼,這還算是好的,而有的情況,父類中的方法是看不見原代碼
的,這個(gè)時(shí)候你怎么去重寫原有的代碼呢?我們也有解決的辦法,就是在子類這個(gè)方法中可
以調(diào)用到父類中被覆蓋的方法,也就是把被覆蓋的方法原有的功能拿過來再加上自己的一點(diǎn)
功能,可以通過兩種方法實(shí)現(xiàn)在子類的方法中調(diào)用父類被覆蓋的方法:
一種是使用父類的“類名::“來調(diào)用父類中被覆蓋的方法;
一種是使用“parent::”的方試來調(diào)用父類中被覆蓋的方法;
代碼片段
復(fù)制代碼 代碼如下:
class Student extends Person{
var $school; //學(xué)生所在學(xué)校的屬性
//這個(gè)學(xué)生學(xué)習(xí)的方法
function study() {
echo "我的名子叫:".$this->name." 我正在”.$this->school.”學(xué)習(xí)<br>";
}
//這個(gè)學(xué)性可以說話的方法, 說出自己所有的屬性,覆蓋了父類的同名方法
function say() {
//使用父類的“類名::“來調(diào)用父類中被覆蓋的方法;
// Person::say();
//或者使用“parent::”的方試來調(diào)用父類中被覆蓋的方法;
parent::say();
//加上一點(diǎn)自己的功能
echo “我的年齡是:".$this->age."我在".$this->school."上學(xué).<br>";
}
}
現(xiàn)在用兩種方式都可以訪問到父類中被覆蓋的方法,我們選那種方式最好呢?用戶可能
會(huì)發(fā)現(xiàn)自己寫的代碼訪問了父類的變量和函數(shù)。如果子類非常精煉或者父類非常專業(yè)化的時(shí)
候尤其是這樣。不要用代碼中父類文字上的名字,應(yīng)該用特殊的名字parent,它指的就是子
類在extends 聲明中所指的父類的名字。這樣做可以避免在多個(gè)地方使用父類的名字。如果繼
承樹在實(shí)現(xiàn)的過程中要修改,只要簡單地修改類中extends 聲明的部分。
同樣,構(gòu)造方法在子類中如果沒有聲明的話,也可以使用父類中的構(gòu)造方法,如果子類
中重新定義了一個(gè)構(gòu)造方法也會(huì)覆蓋掉父類中的構(gòu)造方法,如果想使用新的構(gòu)造方法為所有
屬性賦值也可以用同樣的方式。
代碼片段
復(fù)制代碼 代碼如下:
class Student extends Person{
var $school; //學(xué)生所在學(xué)校的屬性
function __construct($name, $sex, $age, $school){
//使用父類中的方法為原有的屬性賦值
parent::__construct($name, $sex, $age);
$this->school=$school;
}
//這個(gè)學(xué)生學(xué)習(xí)的方法
function study() {
echo "我的名子叫:".$this->name." 我正在”.$this->school.”學(xué)習(xí)<br>";
}
//這個(gè)人可以說話的方法, 說出自己的屬性
function say() {
parent::say();
//加上一點(diǎn)自己的功能
echo “我的年齡是:".$this->age."我在".$this->school."上學(xué).<br>";
php技術(shù):php面向?qū)ο笕ヂ?(八)重載新的方法,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。