* 本文是《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);
}
}
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() {
}
/*
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() {
}
http: //www.bkjia.com/PHPjc/314036.htmlTechArticle* 本文是對《Classes and Objects in PHP5》系列文章的補充與修正,介紹了PHP5物件系統的整體框架,但有些特性沒有具體介紹。強烈建議在讀《...
PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

Atom編輯器mac版下載
最受歡迎的的開源編輯器