首頁 後端開發 php教程 PHP5物件體系_PHP教程

PHP5物件體系_PHP教程

Jul 21, 2016 pm 04:11 PM
php5 物件 文章 系列


* 本文是《Classes and Objects in PHP5》系列文章的補充與修正,介紹了PHP5物件系統的整體框架,但有些特性沒有具體介紹。強烈建議在讀過《Classes and Objects in PHP5》後閱讀本文。



PHP5推出的物件體系相信是大家最期待的。 PHP5借鑒了Java2的物件模型,提供了較為強大的物件導向程式設計支持,使用PHP來實現OO將變得輕鬆和自然。



物件傳遞



PHP5使用了Zend引擎II,物件儲存於獨立的結構Object Store中,而不像其它一般變量那樣儲存於Zval中(在PHP4中物件和一般變數一樣儲存於Zval)。在Zval中僅儲存物件的指標而非內容(value)。當我們複製一個物件或將一個物件當作參數傳遞給一個函數時,我們不需要複製資料。僅僅保持相同的物件指標並由另一個zval通知現在這個特定的物件所指向的Object Store。由於物件本身位於Object Store,我們對它所做的任何改變將影響到所有持有該物件指標的zval結構----表現在程式中就是目標物件的任何改變都會影響到來源物件。 。這使得PHP物件看起來就像總是透過引用(reference)來傳遞,因此PHP中物件預設為透過「引用」傳遞,你不再需要像在PHP4中那樣使用&來宣告。



垃圾回收機制

某些語言,最典型的如C,需要你明確地要求分配記憶體當你創建資料結構時。一旦你分配到內存,就可以在變數中存儲資訊。同時你也需要在結束使用變量時釋放內存,這使機器可以空出內存給其它變量,避免耗光內存。

PHP可以自動進行記憶體管理,清除不再需要的物件。 PHP使用了引用計數(reference counting)這個單純的垃圾回收(garbage collection)機制。每個對象內含一個引用計數器,每個reference連接到對象,計數器加1。當reference離開生存空間或被設為NULL,計數器會減1。當某個物件的參考計數器為零時,PHP知道你將不再需要使用這個對象,釋放其所佔的記憶體空間。

例如:

class Person{
}
function sendEmailTo(){
}

$haohappy = new ( );
// 建立一個新物件: 引用計數Reference count = 1
$haohappy2 = $haohappy;
// 透過引用複製: Reference count = 2
unset($haohappy);
// 刪除一個引用: Reference count = 1
sendEmailTo($haohappy2);
// 透過引用傳遞物件:
// 在函數執行期間:
// Reference count = 2
// 執行結束後:
// Reference count = 1

unset($haohappy2);
// 刪除引用: Reference count = 0 自動釋放記憶體空間

?>



以上是PHP5在記憶體管理上的變化,也許大家不太感興趣。下面我們來看看PHP5中的物件模型和PHP4有什麼具體的差異:



★ 新增功能

★ 改進功能



1) ★ Private and Protected Members 私有和保護類別成員(屬性,方法)

2) ★ Abstract Classes and Methods 抽象類別和抽象方法

3) ★ Interfaces 接口

4) ★ Class Type Hints 類型指示=

5) ★ final final關鍵字=

6) ★ Objects Cloning 對象複製=

7) ★ Constructors and Destructors 建構子與析構函式

8) ★ Class Constants 類別常數=

9) ★ Exceptions 異常處理

10) ★ Static member 靜態類別成員

11) ★__METHOD__ constant __METHOD__常數=

12) ★ Reflection 反射機制




第1、2、33 7、10請自行查閱本文最後的《Classes and Objects in PHP5》系列,其中已有詳細介紹,本文不再講解。第9點異常處理與第12點反射機制內容較為豐富,限於篇幅亦不在文中介紹,請關注即將推出的《PHP & More》電子雜誌第二期,會專門撰文介紹。



以下向大家介紹第4、5、6、8、11點語言特性:



4) ★ Class Type Hints 類型指示


大家都知道,PHP是一種弱型的語言。在使用變數前不需要定義,不需要宣告變數的資料型態。這在程式設計中帶來很多便利,但也帶了一些隱患,特別當變數的類型變化時。在PHP5增加了類型指示,可以在執行過程中自動對類別方法的參數類型進行判斷。這類似於Java2中的RTTI,配合reflection可以讓我們很好地控制物件。





interface Foo {
function a(Foo $foo);
}
function b(Bar $bar);
}

class FooBar implements Foo, Bar {
function a(Foo $foo) {
// ...
}

function b(Bar $bar) {
// ...
}
}

$a = new FooBar;
$b = new FooBar;

$a->a($b);
$a->b($b);
?>



在在強類型語言中,所有變數的類型將在編譯時進行檢查,而在PHP中使用類型指示來對類型的檢查則發生在執行時。如果類別方法參數的類型不對,將會報出類似「Fatal error: Argument 1 must implement interface Bar…」這樣的錯誤訊息。



以下程式碼:

function foo(ClassName $object) {
// ...
}
?>



相當於:

function foo($object) {
if (!($object instanceof ClassName)) {
die("Argument 1 must be an instance of ClassName");
}
}
?>











PHP5中新增加了final關鍵字,它可以加在類別或類別方法前。標識為final的類別方法,在子類別中不能被覆寫。標識為final的類,不能被繼承,而且其中的方法都預設為final類型。

Final方法:

class Foo {
final function bar() {
// ...
}
}
?>



Final類別:

final class Foo {
// class definition
}



// 下面這一行是錯誤的
// class Bork extends Foo {}
?>



6) ★ Objects Cloning 對象複製

前面在記憶體管理部說過,PHP5預設透過引用傳遞物件。像使用$object2=$object1這樣的方法複製出來的物件是相互關聯的。如果我們確實需要複製出一個值與原來相同的物件而希望目標物件與來源物件沒有關聯(像普通變數那樣透過值來傳遞),那麼就需要使用clone關鍵字。如果還希望在複製的同時變動來源物件中的某些部分,可以在類別中定一個__clone()函數,加入操作。



//物件複製
class MyCloneable {
static $id = 0;

function MyCloneable() { $this->id = self::$id ;
}


/*
function __clone() {
$this->address = "New York";
$this->id = self::$id ;
}
*/
}

$obj = new MyCloneable();

$obj ->name = "Hello";
$obj->address = "Tel-Aviv";

print $obj->id . "n";

$obj_cloned = clone $obj;

print $obj_cloned->id . "n";
print $obj_cloned->name . "n";
print $obj_cloned->address . "n";
?>



以上程式碼複製出一個完全相同的物件。



然後請把function __clone()這一函數的註解去掉,重新執行程式。則會複製出一個基本上相同,但部份屬性變動的物件。



8) ★ Class Constants 類別常數

PHP5中可以使用const關鍵字定義類別常數。



class Foo {
const constant = "constant";
}

echo "Foo::constant = " . Foo::constant . "n";
?>

















11) ★__METHOD__ constant __METHOD__常數

__METHOD__ 是PHP5新增的「魔術方法」常數,表示魔術方法的名稱。
魔術常數是一種PHP預定義常數,它的值可以是變化的,PHP中的其它已經存在的魔術常數有__LINE__、__FILE__、__FUNCTION__、__CLASS__等。

class Foo {
function show() {
echo __METHOD__;
}
}

class Bar extends Foo

class Bar extends Foo

class Bar extend >}

Foo::show(); // outputs Foo::show
Bar::show(); // outputs Foo::show either since __METHOD__ is
// compile- time evaluated token

function test() {

echo __METHOD__;

}

?> (來源:Vip ) http://www.bkjia.com/PHPjc/314036.htmlwww.bkjia.comtrue
http: //www.bkjia.com/PHPjc/314036.htmlTechArticle
* 本文是對《Classes and Objects in PHP5》系列文章的補充與修正,介紹了PHP5物件系統的整體框架,但有些特性沒有具體介紹。強烈建議在讀《...
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

如何在技嘉主機板上設定鍵盤啟動功能 (技嘉主機板啟用鍵盤開機方式) 如何在技嘉主機板上設定鍵盤啟動功能 (技嘉主機板啟用鍵盤開機方式) Dec 31, 2023 pm 05:15 PM

技嘉的主機板怎麼設定鍵盤開機首先,要支援鍵盤開機,一定是PS2鍵盤! !設定步驟如下:第一步:開機按Del或F2進入bios,到bios的Advanced(進階)模式普通主機板預設進入主機板的EZ(簡易)模式,需要按F7切換到進階模式,ROG系列主機板預設進入bios的進階模式(我們用簡體中文來示範)第二步:選擇到-【進階】-【進階電源管理(APM)】第三步:找到選項【由PS2鍵盤喚醒】第四步:這個選項預設是Disabled(關閉)的,下拉之後可以看到三種不同的設定選擇,分別是按【空白鍵】開機、按組

php5和php8有什麼差別 php5和php8有什麼差別 Sep 25, 2023 pm 01:34 PM

php5和php8的差異在效能、語言結構、型別系統、錯誤處理、非同步程式設計、標準函式庫函數和安全性等方面。詳細介紹:1、效能提升,PHP8相對於PHP5來說在效能方面有了巨大的提升,PHP8引入了JIT編譯器,可以對一些高頻執行的程式碼進行編譯和最佳化,從而提高運行速度;2、語言結構改進,PHP8引入了一些新的語言結構和功能,PHP8支援命名參數,允許開發者透過參數名稱而不是參數順序等等。

CS玩家的首選:建議的電腦配置 CS玩家的首選:建議的電腦配置 Jan 02, 2024 pm 04:26 PM

1.處理器在選擇電腦配置時,處理器是至關重要的組件之一。對於玩CS這樣的遊戲來說,處理器的效能直接影響遊戲的流暢度和反應速度。建議選擇IntelCorei5或i7系列的處理器,因為它們具有強大的多核心處理能力和高頻率,可以輕鬆應對CS的高要求。 2.顯示卡顯示卡是遊戲表現的重要因素之一。對於射擊遊戲如CS而言,顯示卡的表現直接影響遊戲畫面的清晰度和流暢度。建議選擇NVIDIAGeForceGTX系列或AMDRadeonRX系列的顯示卡,它們具備出色的圖形處理能力和高幀率輸出,能夠提供更好的遊戲體驗3.內存電

使用PHP的json_encode()函數將陣列或物件轉換為JSON字串 使用PHP的json_encode()函數將陣列或物件轉換為JSON字串 Nov 03, 2023 pm 03:30 PM

JSON(JavaScriptObjectNotation)是一種輕量級的資料交換格式,已成為Web應用程式之間資料交換的常用格式。 PHP的json_encode()函數可以將陣列或物件轉換為JSON字串。本文將介紹如何使用PHP的json_encode()函數,包括語法、參數、傳回值以及具體的範例。語法json_encode()函數的語法如下:st

今日頭條發布文章怎麼有收益?今日頭條發布文章獲得更多收益方法! 今日頭條發布文章怎麼有收益?今日頭條發布文章獲得更多收益方法! Mar 15, 2024 pm 04:13 PM

一、今日頭條發布文章怎麼有收益?今日頭條發布文章獲得更多收益方法! 1.開通基礎權益:原創文章選擇投放廣告可獲得收益,影片必須原創橫屏才會有收益。 2.開通百粉權益:粉絲量達百粉以上,微頭條、原創問答創作及問答均可獲得收益。 3.堅持原創作品:原創作品包含文章、微標題及問題等,要求300字以上。注意違規抄襲作品作為原創發布,會被扣信用分,即使有收益也會被扣除。 4.垂直度:做專業領域一類的文章,不能隨意跨領域寫文章,會得不到合適的推薦,達不到作品的專和精,難以吸引粉絲讀者。 5.活躍度:活躍度高,

主機板上的數位音訊輸出介面-SPDIF OUT 主機板上的數位音訊輸出介面-SPDIF OUT Jan 14, 2024 pm 04:42 PM

主機板上SPDIFOUT連接線序最近我遇到了一個問題,就是關於電線的接線順序。我上網查了一下,有些資料說1、2、4對應的是out、+5V、接地;而有些資料則說1、2、4對應的是out、接地、+5V。最好的方法是查看你的主機板說明書,如果找不到說明書,你可以使用萬用電表進行測量。首先找到接地,然後就可以確定其他的接線順序了。主機板vdg怎麼接線連接主機板的VDG接線時,您需要將VGA連接線的一端插入顯示器的VGA接口,另一端插入電腦的顯示卡VGA接口。請注意,不要將其插入主機板的VGA介面。完成連接後,您可以

小米 15 系列全代號曝光:Dada、Haotian、Xuanyuan 小米 15 系列全代號曝光:Dada、Haotian、Xuanyuan Aug 22, 2024 pm 06:47 PM

小米15系列預計10月正式發布,其全系列代號已在外媒MiCode程式碼庫曝光。其中,旗艦級小米15Ultra代號為"Xuanyuan"(意為"軒轅"),此名源自中國神話中的黃帝,象徵尊貴。小米15的代號為"Dada",而小米15Pro則以"Haotian"(意為"昊天")為名。小米15SPro內部代號為"dijun",暗指《山海經》創世神帝俊。小米15Ultra系列涵蓋

廣聯達軟體電腦設定推薦;廣聯達軟體對電腦的設定需求 廣聯達軟體電腦設定推薦;廣聯達軟體對電腦的設定需求 Jan 01, 2024 pm 12:52 PM

廣聯達軟體是一家專注於建築資訊化領域的軟體公司,其產品被廣泛應用於建築設計、施工、營運等各個環節。由於廣聯達軟體功能複雜、資料量大,對電腦的配置要求較高。本文將從多個方面詳細說明廣聯達軟體的電腦配置推薦,以幫助讀者選擇適合的電腦配置處理器廣聯達軟體在進行建築設計、模擬等操作時,需要進行大量的數據計算和處理,因此對處理器的要求較高。建議選擇多核心、高主頻的處理器,如英特爾i7系列或AMDRyzen系列。這些處理器具有較強的運算能力和多執行緒處理能力,能夠更好地滿足廣聯達軟體的需求。記憶體記憶體是影響計算

See all articles