程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php面向對象編程的多態性

php面向對象編程的多態性

編輯:PHP綜合

php方法重載(overload)

重載是類的多態性的一種實現。函數重載是指一個標識符被用作多個函數名,且能夠通過函數的參數個數或者參數類型將這些同名的函數區分開來,調用時不會發生混淆。調用的時候,雖然方法名字相同,但根據參數表可以自動調用對應的函數。

php5支持重載,但在重載的具體實現上,與其它編程語言有較大的區別。

<?php
class A{
public function test1(){
echo "test1";
}
public function test1($a){
echo "hello";
}
}
$a=new A();
$a->test1();
?>

上面這種用法不對,運行時將會報錯:Fatal error: Cannot redeclare A::test1() in……

php5如何實現重載(官方不推薦)

php5通過魔術函數__call來實現函數重載。

php5默認情況下不支持直接方法重載,可以使用__call模擬方法重載的效果。

<?php
class A{
public function test1($p){
echo "接收一個參數";
}
public function test2($p){
echo "接收兩個參數".__CLASS__; //__CLASS__是魔術常量,顯示當前類名
}
//用魔術方法__call實現方法重載
// __call是一個對象調用某個方法,而該方法不存在,則系統會自動調用__call
function __call($method,$p){
if($method=="test"){
if(count($p)==1){
$this->test1($p);
}else if(count($p)==2){
$this->test2($p);
}
}
}
}
$a=new A();
$a->test(1); //輸出:接收一個參數
echo "<br />";
$a->test(100,2);
echo "<br />".__LINE__; //以下是魔術常量的使用
echo "<br />".__FILE__;
echo "<br />".__DIR__;
?>

php方法的重寫/方法的覆蓋(override)

當一個父類知道所有子類都有一個方法,但是父類不能確定該方法的內容,可以讓子類去覆蓋這個方法。

1)要實現重寫,父類和子類的函數名及參數需要完全一致

2)如果子類需要調用父類的某個方法(public/protected),則可以使用

parent:方法名(參數...);

或者

父類名:方法名(參數...)

例:動物的叫聲

<?php
//抽象一個Animal類
class Animal{
public $name;
protected $price;
function cry(){
echo "暫時不知道,父類暫定不了";
}
}
class Dog extends Animal{
function cry(){ //覆蓋父類的cry方法
echo "狗汪汪叫!";
}
}
class Pig extends Animal{
function cry(){ //覆蓋父類的cry方法
echo "豬哼哼叫!";
echo "<br /".parent::cry(); //子類中調用父類的方法
}
}
//創建一只狗
$dog1=new Dog();
$dog1->cry();
$pig1=new Pig();
$pig1->cry();
?>

3)方法覆蓋時,訪問修飾符可以不一樣,但子類的訪問范圍必須>=父類的

<?php
//在實現方法覆蓋的時候,訪問修飾符可以不一樣,
//但必須滿足:子類的訪問范圍要>=父類的訪問范圍
class Animal{
public $name;
protected $price;
//覆蓋父類的cry方法
public function cry(){
echo "暫時不知道,父類暫定不了";
}
}
class Dog extends Animal{
protected function cry(){ //此句會報錯,因為父類的cry()是public的,子類的protected權限小於父類的
echo "狗汪汪叫!";
}
}
class Pig extends Animal{
function cry(){
echo "豬哼哼叫!";
//調用父類的方法
echo "<br /".parent::cry();
}
}
//創建一只狗
$dog1=new Dog();
$dog1->cry();
$pig1=new Pig();
$pig1->cry();
?>

URL:http://www.bianceng.cn/webkf/PHP/201610/50465.htm

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved