首頁 php教程 PHP开发 php物件導向的方法重載兩種版本比較

php物件導向的方法重載兩種版本比較

Dec 14, 2016 am 11:57 AM
物件導向

多個函數用同一個名字,但參數表,即參數的個數或(和)資料型別可以不同,呼叫的時候,雖然方法名字相同,但根據參數表可以自動呼叫對應的函數。
PHP4 中僅僅實現了物件導向的部分的、簡單的功能,而 PHP5 以後對物件的支援就強大的多了。
對於多態的實現,PHP4 只支援覆蓋(override),而不支援重載(overload)。但我們可以透過一些技巧來「模擬」重載的實現。
PHP5 雖然可以支援覆蓋和重載,但重載在具體實作上,和其他語言還有較大的差異。
1,在PHP4 中「模擬」重載

試看以下程式碼:

//根據參數個數選擇執行不同的方法(在PHP4 模擬"重載"(多態性的一種)

class Myclass 

function Myclass() 

$method = "method" . func_num_args(); 
$this->$method(); 
}

function method1($x) 

echo " method1"; 
}

function method2($x, $y) 

echo 'method2'; 

}

//透過在類別中的額外使用,
$obj1 = new Myclass('A'); //將呼叫method1 
$obj2 = new Myclass('B','C'); //將呼叫method2 
?>

以上程式碼中,透過建構在建構函式中使用func_num_args() 函式取到參數的個數,自動執行method1 或method2 方法。

先看以下範例:

複製程式碼如下:

class Myclass 

public $attriable; 
public $one = "this is one"; 
.

function __construct() 
{ }


function one($one) 

$this->one=$one; 

}$this->attriable; $one, $two) 

$this->one=$one; 
$this->two=$two; 
$this->attriable = $this->one . $this->two 

}


function display() 

echo $this->attriable; 

}

$one = "this is my class"; 
$two = "I$one = "this is my class"; 
$mym
$myclass->one($one); 
$myclass->display();

$myclass->one($one, $two); 
$myclass->display();

//本例的做法,在PHP 中是不正確的! 
?>


使用過 C++、Java、C# 重載的人,很習慣就會寫出以上的重載實作的 PHP 程式碼。但這在 PHP5 中是不正確的。 PHP5 並不是對前述幾種語言的模仿,而是有自己的一套實作方法重載的方法(是好是壞,這裡不討論)。 雖然 PHP5 的類別較 PHP4 強大了許多,但在「重載」這個問題上並沒有像我們預期的那樣「改善」。在“強”類型的語言中可以透過不同的參數類型來實現“重載”,例如C++、Java、C# 等。在「固定參數」傳遞的語言中,也可以透過參數的數量傳遞,例如 Java,但是 PHP 是弱型別語言,因此不會出現類似以上的「重載」。

PHP5 中重載可以透過 __get, __set, and __call 幾個特殊方法來進行。當 Zend 引擎試圖存取一個成員並沒有找到時,PHP將會呼叫這些方法。

在以下範例中,__get和__set取代所有對屬性變數數組的存取。如果必要,你還可以實現任何類型你想要的過濾。例如,腳本可以禁止設定屬性值, 在開始時用一定的前綴或包含一定類型的值。 __call 方法說明了你如何呼叫未經定義的方法。當你呼叫未定義方法時,方法名稱和方法接收的參數將會傳給__call方法, PHP傳遞__call的值傳回給未定義的方法。


程式碼如下:

class Overloader 

private $properties = array();


function __get($property_name)y();

function __get($property_name) .

return($this->properties[$property_name]); 

else 

return(NULL); 

}
}
> properties[$property_name] = $value; 
}

public function __call($method, $p) 

print("Invoking $method()
n"); 
//print("Arguments: "); 
//print_r($args); if($method == 'display') 

if(is_object($p[0])) 
$this->displayObject($p[0]); 
else 
if(is_array($p[0] )) 
$this->displayArray($p[0]); 
else 
$this->displayScalar($p[0]); 

}
public function display($p) "你傳入的是個對象,內容如下:
"); 

print_r($p); 

echo "


"; 
}

public function displayArray($p) 

e ( 傳入的是個數組,內容如下:
"); 

print_r($p); 
echo "


"; 
}

public function displayScalar($p) 
{ public function displayScalar($p) 


e (的是單獨變量,內容如下:
" . $p); 
echo "


"; 

}
$o = new Overloader();

//調用__set() 給一個不存在的屬性變數賦值 

$o->dynaProp = "Dynamic Content";

//呼叫__get() 

print($o->dynaProp . "
n");

//呼叫_ _call() 

//$o->dynaMethod("Leon", "Zeev");

$o->display(array(1,2,3)); 

$o->display('Cat') ; 
?>

以上程式碼中,呼叫了display() 方法,可以根據參數的類型和個數呼叫類別中的對應的程式碼段,從而實現了物件方法的重載。

感謝您的閱讀,想要更多的相關內容請關注PHP中文網(www.php.cn)!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1665
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
如何使用Go語言實現物件導向的事件驅動程式設計 如何使用Go語言實現物件導向的事件驅動程式設計 Jul 20, 2023 pm 10:36 PM

如何使用Go語言實現物件導向的事件驅動程式設計引言:物件導向的程式設計範式被廣泛應用於軟體開發中,而事件驅動程式設計是一種常見的程式設計模式,它透過事件的觸發和處理來實現程式的流程控制。本文將介紹如何使用Go語言實現物件導向的事件驅動編程,並提供程式碼範例。一、事件驅動程式設計的概念事件驅動程式設計是一種基於事件和訊息的程式設計模式,它將程式的流程控制轉移到事件的觸發和處理上。在事件驅動

@JsonIdentityInfo註解在Java中使用Jackson的重要性是什麼? @JsonIdentityInfo註解在Java中使用Jackson的重要性是什麼? Sep 23, 2023 am 09:37 AM

當物件在Jackson庫中具有父子關係時,將使用@JsonIdentityInfo註解。 @JsonIdentityInfo 註解 用於在序列化和反序列化過程中指示物件身分。 ObjectIdGenerators.PropertyGenerator是一個抽象佔位符類,用來表示要使用的物件識別碼來自POJO屬性的情況。語法@Target(value={ANNOTATION_TYPE,TYPE,FIELD,METHOD,PARAMETER})@Retention(value=RUNTIME)public

PHP高階特性:物件導向程式設計的最佳實踐 PHP高階特性:物件導向程式設計的最佳實踐 Jun 05, 2024 pm 09:39 PM

PHP中OOP最佳實務包括命名約定、介面與抽象類別、繼承與多型、依賴注入。實戰案例包括:使用倉庫模式管理數據,使用策略模式實現排序。

探索Go語言中的物件導向編程 探索Go語言中的物件導向編程 Apr 04, 2024 am 10:39 AM

Go語言支援物件導向編程,透過型別定義和方法關聯實作。它不支援傳統繼承,而是透過組合實現。介面提供了類型間的一致性,允許定義抽象方法。實戰案例展示如何使用OOP管理客戶訊息,包括建立、取得、更新和刪除客戶操作。

Golang中有類似類別的物件導向特性嗎? Golang中有類似類別的物件導向特性嗎? Mar 19, 2024 pm 02:51 PM

在Golang(Go語言)中並沒有傳統意義上的類別的概念,但它提供了一種稱為結構體的資料類型,透過結構體可以實現類似類別的物件導向特性。在本文中,我們將介紹如何使用結構體實現物件導向的特性,並提供具體的程式碼範例。結構體的定義和使用首先,讓我們來看看結構體的定義和使用方式。在Golang中,結構體可以透過type關鍵字定義,然後在需要的地方使用。結構體中可以包含屬

解析PHP物件導向程式設計中的享元模式 解析PHP物件導向程式設計中的享元模式 Aug 14, 2023 pm 05:25 PM

解析PHP物件導向程式設計中的享元模式在物件導向程式設計中,設計模式是一種常用的軟體設計方法,它可以提高程式碼的可讀性、可維護性和可擴充性。享元模式(Flyweightpattern)是設計模式中的一種,它透過共享物件來降低記憶體的開銷。本文將探討如何在PHP中使用享元模式來提升程式效能。什麼是享元模式?享元模式是一種結構型設計模式,它的目的是在不同物件之間共享相同的

Go語言的物件導向特性解析 Go語言的物件導向特性解析 Apr 04, 2024 am 11:18 AM

Go語言支援物件導向編程,透過struct定義對象,使用指標接收器定義方法,並透過介面實現多態。物件導向特性在Go語言中提供了程式碼重用、可維護性和封裝,但也存在缺乏傳統類別和繼承的概念以及方法簽章強制型別轉換的限制。

PHP物件導向程式設計的深入理解:物件導向程式設計的除錯技巧 PHP物件導向程式設計的深入理解:物件導向程式設計的除錯技巧 Jun 05, 2024 pm 08:50 PM

透過掌握追蹤物件狀態、設定斷點、追蹤異常和利用xdebug擴展,可以有效調試PHP物件導向程式碼。 1.追蹤物件狀態:使用var_dump()和print_r()檢視物件屬性和方法值。 2.設定斷點:在開發環境中設定斷點,偵錯器會在執行到達斷點時暫停,以便檢查物件狀態。 3.追蹤異常:使用try-catch區塊和getTraceAsString()取得異常發生時的堆疊追蹤和訊息。 4.利用偵錯器:xdebug_var_dump()函數可在程式碼執行過程中檢查變數的內容。

See all articles