php面向?qū)ο笕ヂ?(十五) 多態(tài)的應(yīng)用
更新時(shí)間:2009年09月30日 22:40:49 作者:
多態(tài)是除封裝和繼承之外的另一個(gè)面向?qū)ο蟮娜筇匦灾?,我個(gè)人看來PHP 中雖然可以實(shí)現(xiàn)多態(tài),但和C++還有Java 這些面向?qū)ο蟮恼Z言相比,多態(tài)性并不是那么突出
多態(tài)的應(yīng)用
多態(tài)是除封裝和繼承之外的另一個(gè)面向?qū)ο蟮娜筇匦灾?,我個(gè)人看來PHP 中雖然可
以實(shí)現(xiàn)多態(tài),但和C++還有Java 這些面向?qū)ο蟮恼Z言相比,多態(tài)性并不是那么突出,因?yàn)镻HP
本身就是一種弱類型的語言,不存在父類對(duì)象轉(zhuǎn)化為子類對(duì)象或者是子類對(duì)象轉(zhuǎn)化為父類對(duì)
象的問題,所以多態(tài)的應(yīng)用并不是那么的明顯;所謂多態(tài)性是指一段程序能夠處理多種類型
對(duì)象的能力,比如說在公司上班,每個(gè)月財(cái)務(wù)發(fā)放工資,同一個(gè)發(fā)工資的方法,在公司內(nèi)不
同的員工或是不同職位的員工,都是通過這個(gè)方法發(fā)放的,但是所發(fā)的工資都是不相同的。
所以同一個(gè)發(fā)工資的方法就出現(xiàn)了多種形態(tài)。對(duì)于面向?qū)ο蟮某绦騺碚f,多態(tài)就是把子類對(duì)
象賦值給父類引用,然后調(diào)用父類的方法,去執(zhí)行子類覆蓋父類的那個(gè)方法,但在PHP 里是
弱類型的,對(duì)象引用都是一樣的不分父類引用,還是子類引用。
我們現(xiàn)在來看一個(gè)例子,首先還是要使用多態(tài)就要有父類對(duì)象和子類對(duì)象的關(guān)系。做一
個(gè)形狀的接口或是抽象類做為父類,里面有兩個(gè)抽象方法,一個(gè)求周長的方法,另一個(gè)是求
面積的方法;這接口的子類是多種不同的形狀,每個(gè)形狀又都有周長和面積,又因?yàn)楦割愂?
一個(gè)接口,所以子類里面就必須要實(shí)現(xiàn)父類的這兩個(gè)周長和面積的抽象方法,這樣做的目的
是每種不同形狀的子類都遵守父類接口的規(guī)范,都要有求周長和求面積的方法。
代碼片段
<?
//定義了一個(gè)形狀的接口,里面有兩個(gè)抽象方法讓子類去實(shí)現(xiàn)
interface Shape{
function area();
function perimeter();
}
//定義了一個(gè)矩形子類實(shí)現(xiàn)了形狀接口中的周長和面積
class Rect implements Shape{
private $width;
private $height;
function __construct($width, $height){
$this->width=$width;
$this->height=$height;
}
function area(){
return "矩形的面積是:".($this->width*$this->height);
}
function perimeter(){
return "矩形的周長是:".(2*($this->width+$this->height));
}
}
//定義了一個(gè)圓形子類實(shí)現(xiàn)了形狀接口中的周長和面積
class Circular implements Shape{
private $radius;
function __construct($radius){
$this->radius=$radius;
}
function area(){
return "圓形的面積是:".(3.14*$this->radius*$this->radius);
}
function perimeter(){
return "圓形的周長是:".(2*3.14*$this->radius);
}
}
//把子類矩形對(duì)象賦給形狀的一個(gè)引用
$shape=new Rect(5, 10);
echo $shape->area()."<br>";
echo $shape->perimeter()."<br>";
//把子類圓形對(duì)象賦給形狀的一個(gè)引用
$shape=new Circular(10);
echo $shape->area()."<br>";
echo $shape->perimeter()."<br>";
?>
上例執(zhí)行結(jié)果:
執(zhí)行結(jié)果
矩形的面積是:50
矩形的周長是:30
圓形的面積是:314
圓形的周長是:62.8
通過上例我們看到,把矩形對(duì)象和圓形對(duì)象分別賦給了變量$shape,調(diào)用$shape 引用中
的面積和周長的方法,出現(xiàn)了不同的結(jié)果,這就是一種多態(tài)的應(yīng)用,其實(shí)在我們PHP 這種弱
類形的面向?qū)ο蟮恼Z言里面,多態(tài)的特性并不是特別的明顯,其實(shí)就是對(duì)象類型變量的變項(xiàng)
應(yīng)用。
多態(tài)是除封裝和繼承之外的另一個(gè)面向?qū)ο蟮娜筇匦灾?,我個(gè)人看來PHP 中雖然可
以實(shí)現(xiàn)多態(tài),但和C++還有Java 這些面向?qū)ο蟮恼Z言相比,多態(tài)性并不是那么突出,因?yàn)镻HP
本身就是一種弱類型的語言,不存在父類對(duì)象轉(zhuǎn)化為子類對(duì)象或者是子類對(duì)象轉(zhuǎn)化為父類對(duì)
象的問題,所以多態(tài)的應(yīng)用并不是那么的明顯;所謂多態(tài)性是指一段程序能夠處理多種類型
對(duì)象的能力,比如說在公司上班,每個(gè)月財(cái)務(wù)發(fā)放工資,同一個(gè)發(fā)工資的方法,在公司內(nèi)不
同的員工或是不同職位的員工,都是通過這個(gè)方法發(fā)放的,但是所發(fā)的工資都是不相同的。
所以同一個(gè)發(fā)工資的方法就出現(xiàn)了多種形態(tài)。對(duì)于面向?qū)ο蟮某绦騺碚f,多態(tài)就是把子類對(duì)
象賦值給父類引用,然后調(diào)用父類的方法,去執(zhí)行子類覆蓋父類的那個(gè)方法,但在PHP 里是
弱類型的,對(duì)象引用都是一樣的不分父類引用,還是子類引用。
我們現(xiàn)在來看一個(gè)例子,首先還是要使用多態(tài)就要有父類對(duì)象和子類對(duì)象的關(guān)系。做一
個(gè)形狀的接口或是抽象類做為父類,里面有兩個(gè)抽象方法,一個(gè)求周長的方法,另一個(gè)是求
面積的方法;這接口的子類是多種不同的形狀,每個(gè)形狀又都有周長和面積,又因?yàn)楦割愂?
一個(gè)接口,所以子類里面就必須要實(shí)現(xiàn)父類的這兩個(gè)周長和面積的抽象方法,這樣做的目的
是每種不同形狀的子類都遵守父類接口的規(guī)范,都要有求周長和求面積的方法。
代碼片段
復(fù)制代碼 代碼如下:
<?
//定義了一個(gè)形狀的接口,里面有兩個(gè)抽象方法讓子類去實(shí)現(xiàn)
interface Shape{
function area();
function perimeter();
}
//定義了一個(gè)矩形子類實(shí)現(xiàn)了形狀接口中的周長和面積
class Rect implements Shape{
private $width;
private $height;
function __construct($width, $height){
$this->width=$width;
$this->height=$height;
}
function area(){
return "矩形的面積是:".($this->width*$this->height);
}
function perimeter(){
return "矩形的周長是:".(2*($this->width+$this->height));
}
}
//定義了一個(gè)圓形子類實(shí)現(xiàn)了形狀接口中的周長和面積
class Circular implements Shape{
private $radius;
function __construct($radius){
$this->radius=$radius;
}
function area(){
return "圓形的面積是:".(3.14*$this->radius*$this->radius);
}
function perimeter(){
return "圓形的周長是:".(2*3.14*$this->radius);
}
}
//把子類矩形對(duì)象賦給形狀的一個(gè)引用
$shape=new Rect(5, 10);
echo $shape->area()."<br>";
echo $shape->perimeter()."<br>";
//把子類圓形對(duì)象賦給形狀的一個(gè)引用
$shape=new Circular(10);
echo $shape->area()."<br>";
echo $shape->perimeter()."<br>";
?>
上例執(zhí)行結(jié)果:
執(zhí)行結(jié)果
矩形的面積是:50
矩形的周長是:30
圓形的面積是:314
圓形的周長是:62.8
通過上例我們看到,把矩形對(duì)象和圓形對(duì)象分別賦給了變量$shape,調(diào)用$shape 引用中
的面積和周長的方法,出現(xiàn)了不同的結(jié)果,這就是一種多態(tài)的應(yīng)用,其實(shí)在我們PHP 這種弱
類形的面向?qū)ο蟮恼Z言里面,多態(tài)的特性并不是特別的明顯,其實(shí)就是對(duì)象類型變量的變項(xiàng)
應(yīng)用。
您可能感興趣的文章:
- php學(xué)習(xí)筆記 面向?qū)ο笾衃接口]與[多態(tài)性]的應(yīng)用
- PHP5多態(tài)性與動(dòng)態(tài)綁定介紹
- 理解和運(yùn)用PHP中的多態(tài)性[譯]
- PHP面向?qū)ο笕筇攸c(diǎn)學(xué)習(xí)(充分理解抽象、封裝、繼承、多態(tài))
- 實(shí)例講解PHP面向?qū)ο笾鄳B(tài)
- PHP5中實(shí)現(xiàn)多態(tài)的兩種方法實(shí)例分享
- PHP面向?qū)ο缶幊讨钊肜斫夥椒ㄖ剌d與方法覆蓋(多態(tài))
- PHP多態(tài)代碼實(shí)例
- php 三大特點(diǎn):封裝,繼承,多態(tài)
- PHP面向?qū)ο蠖鄳B(tài)性實(shí)現(xiàn)方法簡單示例
相關(guān)文章
PHP中在數(shù)據(jù)庫中保存Checkbox數(shù)據(jù)(1)
PHP中在數(shù)據(jù)庫中保存Checkbox數(shù)據(jù)(1)...2006-10-10如何對(duì)PHP程序中的常見漏洞進(jìn)行攻擊(下)
如何對(duì)PHP程序中的常見漏洞進(jìn)行攻擊(下)...2006-10-10Discuz!5的PHP代碼高亮顯示插件(黑暗中的舞者更新)
Discuz!5的PHP代碼高亮顯示插件(黑暗中的舞者更新)...2007-01-01無數(shù)據(jù)庫的詳細(xì)域名查詢程序PHP版(1)
無數(shù)據(jù)庫的詳細(xì)域名查詢程序PHP版(1)...2006-10-10php學(xué)習(xí)筆記 php中面向?qū)ο笕筇匦灾籟封裝性]的應(yīng)用
就是把對(duì)象的成員(屬性,方法)結(jié)合成一個(gè)獨(dú)立的相同單位,并盡可能隱藏對(duì)象的內(nèi)部細(xì)節(jié)2011-06-06