* 本文是對(duì)《Classes and Objects in PHP5》系列文章的補(bǔ)充和修正,介紹了PHP5對(duì)象體系的總體框架,但有些特性沒(méi)有具體介紹。強(qiáng)烈建議在讀過(guò)《Classes and Objects in PHP5》后閱讀本文 " /> 国产一区再线,伦理一区二区,欧美色道久久88综合亚洲精品

色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

PHP5對(duì)象體系


* 本文是對(duì)《Classes and Objects in php5》系列文章的補(bǔ)充和修正,介紹了php5對(duì)象體系的總體框架,但有些特性沒(méi)有具體介紹。強(qiáng)烈建議在讀過(guò)《Classes and Objects in php5》后閱讀本文。



php5推出的對(duì)象體系相信是大家最為期待的。php5借鑒了Java2的對(duì)象模型,提供了較為強(qiáng)大的面向?qū)ο缶幊讨С郑褂?a href=/itjie/phpjishu/ target=_blank class=infotextkey>php來(lái)實(shí)現(xiàn)OO將變得輕松和自然。



對(duì)象傳遞



php5使用了Zend引擎II,對(duì)象被儲(chǔ)存于獨(dú)立的結(jié)構(gòu)Object Store中,而不像其它一般變量那樣儲(chǔ)存于Zval中(在php4中對(duì)象和一般變量一樣存儲(chǔ)于Zval)。在Zval中僅存儲(chǔ)對(duì)象的指針而不是內(nèi)容(value)。當(dāng)我們復(fù)制一個(gè)對(duì)象或者將一個(gè)對(duì)象當(dāng)作參數(shù)傳遞給一個(gè)函數(shù)時(shí),我們不需要復(fù)制數(shù)據(jù)。僅僅保持相同的對(duì)象指針并由另一個(gè)zval通知現(xiàn)在這個(gè)特定的對(duì)象指向的Object Store。由于對(duì)象本身位于Object Store,我們對(duì)它所作的任何改變將影響到所有持有該對(duì)象指針的zval結(jié)構(gòu)----表現(xiàn)在程序中就是目標(biāo)對(duì)象的任何改變都會(huì)影響到源對(duì)象。.這使php對(duì)象看起來(lái)就像總是通過(guò)引用(reference)來(lái)傳遞,因此php中對(duì)象默認(rèn)為通過(guò)“引用”傳遞,你不再需要像在php4中那樣使用&來(lái)聲明。



垃圾回收機(jī)制

某些語(yǔ)言,最典型的如C,需要你顯式地要求分配內(nèi)存當(dāng)你創(chuàng)建數(shù)據(jù)結(jié)構(gòu)。一旦你分配到內(nèi)存,就可以在變量中存儲(chǔ)信息。同時(shí)你也需要在結(jié)束使用變量時(shí)釋放內(nèi)存,這使機(jī)器可以空出內(nèi)存給其它變量,避免耗光內(nèi)存。

php可以自動(dòng)進(jìn)行內(nèi)存管理,清除不再需要的對(duì)象。php使用了引用計(jì)數(shù)(reference counting)這種單純的垃圾回收(garbage collection)機(jī)制。每個(gè)對(duì)象都內(nèi)含一個(gè)引用計(jì)數(shù)器,每個(gè)reference連接到對(duì)象,計(jì)數(shù)器加1。當(dāng)reference離開(kāi)生存空間或被設(shè)為NULL,計(jì)數(shù)器減1。當(dāng)某個(gè)對(duì)象的引用計(jì)數(shù)器為零時(shí),php知道你將不再需要使用這個(gè)對(duì)象,釋放其所占的內(nèi)存空間。

例如:

<?php
class Person{
}
function sendEmailTo(){
}

$haohappy = new Person( );
// 建立一個(gè)新對(duì)象: 引用計(jì)數(shù) Reference count = 1
$haohappy2 = $haohappy;
// 通過(guò)引用復(fù)制: Reference count = 2
unset($haohappy);
// 刪除一個(gè)引用: Reference count = 1
sendEmailTo($haohappy2);
// 通過(guò)引用傳遞對(duì)象:
// 在函數(shù)執(zhí)行期間:
// Reference count = 2
// 執(zhí)行結(jié)束后:
// Reference count = 1

unset($haohappy2);
// 刪除引用: Reference count = 0 自動(dòng)釋放內(nèi)存空間

?>



以上是php5在內(nèi)存管理上的變化,也許大家不怎么感興趣。下面我們來(lái)看看php5中的對(duì)象模型和php4有什么具體的不同之處:



★ 新增功能

★ 改進(jìn)功能



1) ★ Private and Protected Members 私有和保護(hù)類(lèi)成員(屬性,方法)

2) ★ Abstract Classes and Methods 抽象類(lèi)和抽象方法

3) ★ Interfaces 接口

4) ★ Class Type Hints 類(lèi)型指示 =

5) ★ final final關(guān)鍵字 =

6) ★ Objects Cloning 對(duì)象復(fù)制 =

7) ★ Constructors and Destructors 構(gòu)造函數(shù)和析構(gòu)函數(shù)

8) ★ Class Constants 類(lèi)常量 =

9) ★ Exceptions 異常處理

10) ★ Static member 靜態(tài)類(lèi)成員

11) ★__METHOD__ constant __METHOD__常量 =

12) ★ Reflection 反射機(jī)制



第1、2、3、7、10請(qǐng)自行查閱本文末尾的《Classes and Objects in php5》系列,其中已有詳細(xì)介紹,本文中不再講解。第9點(diǎn)異常處理和第12點(diǎn)反射機(jī)制內(nèi)容較為豐富,限于篇幅亦不在文中介紹,請(qǐng)關(guān)注即將推出的《php & More》電子雜志第二期,會(huì)專(zhuān)門(mén)撰文介紹。



以下向大家介紹第4、5、6、8、11點(diǎn)語(yǔ)言特性:



4) ★ Class Type Hints 類(lèi)型指示



大家都知道,php是一種弱類(lèi)型的語(yǔ)言。在使用變量前不需要定義,不需要聲明變量的數(shù)據(jù)類(lèi)型。這在編程中帶來(lái)很多便利,但也帶了一些隱患,特別當(dāng)變量的類(lèi)型變化時(shí)。在php5增加了類(lèi)型指示,可以在執(zhí)行過(guò)程中自動(dòng)對(duì)類(lèi)方法的參數(shù)類(lèi)型進(jìn)行判斷。這類(lèi)似于Java2中的RTTI,配合reflection可以讓我們很好地控制對(duì)象。





<?php
interface Foo {
function a(Foo $foo);
}

interface Bar {
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);
?>



在強(qiáng)類(lèi)型語(yǔ)言中,所有變量的類(lèi)型將在編譯時(shí)進(jìn)行檢查,而在php中使用類(lèi)型指示來(lái)對(duì)類(lèi)型的檢查則發(fā)生在運(yùn)行時(shí)。如果類(lèi)方法參數(shù)的類(lèi)型不對(duì),將會(huì)報(bào)出類(lèi)似“Fatal error: Argument 1 must implement interface Bar…”這樣的錯(cuò)誤信息。



以下代碼:

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



相當(dāng)于:

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





5) ★ final final關(guān)鍵字



php5中新增加了final關(guān)鍵字,它可以加在類(lèi)或類(lèi)方法前。標(biāo)識(shí)為final的類(lèi)方法,在子類(lèi)中不能被覆寫(xiě)。標(biāo)識(shí)為final的類(lèi),不能被繼承,而且其中的方法都默認(rèn)為final類(lèi)型。

Final方法:

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



Final類(lèi):

<?php
final class Foo {
// class definition
}

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



6) ★ Objects Cloning 對(duì)象復(fù)制

前面在內(nèi)存管理部份說(shuō)過(guò),php5中默認(rèn)通過(guò)引用傳遞對(duì)象。像使用$object2=$object1這樣的方法復(fù)制出的對(duì)象是相互關(guān)聯(lián)的。如果我們確實(shí)需要復(fù)制出一個(gè)值與原來(lái)相同的對(duì)象而希望目標(biāo)對(duì)象與源對(duì)象沒(méi)有關(guān)聯(lián)(像普通變量那樣通過(guò)值來(lái)傳遞),那么就需要使用clone關(guān)鍵字。如果還希望在復(fù)制的同時(shí)變動(dòng)源對(duì)象中的某些部份,可以在類(lèi)中定一個(gè)__clone()函數(shù),加入操作。



<?php
//對(duì)象復(fù)制
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";
?>



以上代碼復(fù)制出一個(gè)完全相同的對(duì)象。



然后請(qǐng)把function __clone()這一個(gè)函數(shù)的注釋去掉,重新運(yùn)行程序。則會(huì)復(fù)制出一個(gè)基本相同,但部份屬性變動(dòng)的對(duì)象。



8) ★ Class Constants 類(lèi)常量

php5中可以使用const關(guān)鍵字來(lái)定義類(lèi)常量。



<?php
class Foo {
const constant = "constant";
}

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

















11) ★__METHOD__ constant __METHOD__常量

__METHOD__ 是php5中新增的“魔術(shù)”常量,表示類(lèi)方法的名稱(chēng)。
魔術(shù)常量是一種php預(yù)定義常量,它的值可以是變化的,php中的其它已經(jīng)存在的魔術(shù)常量有__LINE__、__FILE__、__FUNCTION__、__CLASS__等。

<?php
class Foo {
function show() {
echo __METHOD__;
}
}

class Bar extends Foo {
}

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

function test() {
echo __METHOD__;
}

test(); // outputs test
?>
(出處:Viphot)

php技術(shù)PHP5對(duì)象體系,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 新沂市| 开封县| 上饶市| 弥勒县| 湾仔区| 抚宁县| 辽宁省| 杨浦区| 婺源县| 隆昌县| 延长县| 山阳县| 西乌| 绥阳县| 铜山县| 萨嘎县| 恩施市| 湖州市| 澎湖县| 乌拉特前旗| 大方县| 梨树县| 湖南省| 永德县| 明星| 桐庐县| 蓬莱市| 蒙阴县| 扶沟县| 姚安县| 仁寿县| 长沙县| 民权县| 右玉县| 葵青区| 新邵县| 关岭| 桐城市| 中江县| 公主岭市| 宜章县|