* 本文是對《Classes and Objects in PHP5》系列文章的補充和修正,介紹了PHP5對象體系的總體框架,但有些特性沒有具體介紹。強烈建議在讀過《Classes and Objects in PHP5》后閱讀本文 " /> 午夜看片网,亚洲精品无码专区在线播放 ,中文字幕s级优女区

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

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知道你將不再需要使用這個對象,釋放其所占的內存空間。

例如:

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

$haohappy = new Person( );
// 建立一個新對象: 引用計數 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、3、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可以讓我們很好地控制對象。





<?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);
?>



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



以下代碼:

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



相當于:

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





5) ★ final final關鍵字



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

Final方法:

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



Final類:

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

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



6) ★ Objects Cloning 對象復制

前面在內存管理部份說過,php5中默認通過引用傳遞對象。像使用$object2=$object1這樣的方法復制出的對象是相互關聯的。如果我們確實需要復制出一個值與原來相同的對象而希望目標對象與源對象沒有關聯(像普通變量那樣通過值來傳遞),那么就需要使用clone關鍵字。如果還希望在復制的同時變動源對象中的某些部份,可以在類中定一個__clone()函數,加入操作。



<?php
//對象復制
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關鍵字來定義類常量。



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

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

















11) ★__METHOD__ constant __METHOD__常量

__METHOD__ 是php5中新增的“魔術”常量,表示類方法的名稱。
魔術常量是一種php預定義常量,它的值可以是變化的,php中的其它已經存在的魔術常量有__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技術PHP5對象體系,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产午夜精品一区二区理论影院 | 动漫成年美女黄漫网站 | 亚洲精品久久国产高清 | 男女牲交全过程免费播放 | 秘密教学26我们在做一次吧免费 | 亚洲AV无码乱码国产麻豆P | 777午夜精品久久AV蜜臀 | 国产国产乱老熟视频网站 | 国内精品视频久久久久免费 | a4you销魂gogo人体 | 伊人久久青草青青综合 | 99久久亚洲精品日本无码 | 国产成人精品久久一区二区三区 | 处破女免费播放 | 国产成人免费高清在线观看 | 亚洲人成网站在线观看90影院 | 中文无码在线观 | 日本精品无码久久久久APP | 内射一区二区精品视频在线观看 | 亚洲国产精品综合久久一线 | 国产三级在线免费 | 美艳人妻在厨房翘着屁股 | 欧美性狂猛bbbbbbxxxx | 日本zljzljzlj精品 | 成人免费无毒在线观看网站 | 免费毛片播放 | YELLOW在线观看高清视频免费 | 精品综合久久久久久8888 | 性插图动态图无遮挡 | 成人免费精品视频 | 97伦理电影在线不卡 | 激情女人花 | 亚洲欧美自拍清纯中文字幕 | 成人免费精品视频 | 丝瓜影院观看免费高清国际观察 | 色情在线avav | 蜜桃麻豆WWW久久囤产精品免费 | 嫩草影院在线观看精品 | 久久精品黄AA片一区二区三区 | 美女被爽cao免费漫画 | 冈本视频黄页正版 |