中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁 > 技術(shù)文檔 > 網(wǎng)絡(luò)編程 > PHP4之真OO
[PHP]超越模板引擎 回到列表 [J2EE] 實戰(zhàn)開發(fā)EJB
 PHP4之真OO

作者:BinzyWu 時間: 2004-02-06 文檔類型:翻譯 來自:CSDN

  本文的作者Johan Persson是PHP中著名的JpGraph圖表類庫的開發(fā)者。本文是作者對于在PHP4中進行面向?qū)ο箝_發(fā)時需要注意的幾個小問題的總結(jié)。
  翻譯: Binzy Wu [Mail: Binzy at JustDN dot COM], 水平有限, 歡迎探討。
   原文Url: http://www.aditus.nu/jpgraph/jpg_phpoo.php

簡介

   本文的對象是那些曾使用更加成熟的OO語言, 如Eiffel, Java, C#2 or C++(), 進行開發(fā)的朋友(如我自己).。在使用PHP4進行完全的OO開發(fā)時有著許多的語義3 (semantic) 上的陷阱4.

  希本文內(nèi)容可助人避我曾犯之錯.

引用 VS 拷貝語義

   這基本上是錯誤的主要來源(至少對于我來說).即使在PHP的文檔中你可以讀到PHP4較之引用更多使用拷貝語義(如其他我所知的面向?qū)ο笳Z言), 但這仍將使你最后在一些細小之處困擾.

  接下來的兩部分用于闡述二個小的例子, 在這二個例子中拷貝語義也許會令你驚訝.要時刻牢記重要的是一個類的變量不是一個指向類的指針而是實際的類自己本身5. 大多數(shù)問題引發(fā)自對于賦值操作符(=)的誤解, 即以為是給一個對象一個別名, 而實際上卻是一個新的拷貝. 例如假設(shè)$myObj是某個類的實例, 并且它有一個Set()方法. 那么下面的代碼也許不會像一個C++(或者Java)程序員所期望的那樣工作. function SomeFunction($aObj) { $aObj->Set(10); } … SomeFunction ($myObj); …

   那么現(xiàn)在, 很容易便會認為該函數(shù)所調(diào)用的Set()方法會作用于$myObj. 但這是錯的! 其實發(fā)生的是$myObj被拷貝為一個新的, 與原對象一樣的拷貝----參數(shù)$aObj. 然后當(dāng)Set()方法被調(diào)用時, 它僅僅作用于本地拷貝而非原參數(shù)----$myObj. 在包含直接或間接(如上)賦值操作的地方就會發(fā)生各種各樣的上述問題. 為了函數(shù)能像你所期望的那樣行動(也許是), 那么你不得不通過修改方法申明來告訴PHP使用引用來傳遞對象, 如:

Function SomeFunction(&$aObj)

  如果你再一次嘗試上面的代碼, 那么你會發(fā)現(xiàn)Set()方法將作用于原來的參數(shù)上, 因為現(xiàn)在我們在作用中創(chuàng)建了一個$myObj的別名----$aObj. 但是你不得不小心, 因為即使是&操作符也不是在任何時候都能救你, 如下面的舉例.

從一個引用來獲得引用

   假設(shè)有如下代碼:

$myObject = new SomeClass();$myRefToObject = &$myObject;

  如果我們現(xiàn)在想要一個引用的拷貝(因某些理由), 那么我們要做什么呢? 你可能會由于$myRefToObject已經(jīng)是引用而試圖那么寫:

$myCopyRefToObject = $myRefToObject;

  正確么? ! PHP會創(chuàng)建$myRefToObject所引用對象的新拷貝. 如果你想拷貝一個對象的引用, 你不得不這么寫:

$myCopyRefToObject = &$myRefToObject;

  在與前所述例子相當(dāng)?shù)腃++的例子中, 便會創(chuàng)建一個引用的引用. 與其在PHP中不同. 這是一個經(jīng)驗豐富的C++程序員常會作的直覺假設(shè)相反的, 而這會是你的PHP程序中小BUG的來源.

  請小心由此所產(chǎn)生的間接(傳遞參數(shù))或直接的問題.

  我個人所達成的結(jié)論, 即最好的避免這些語義陷阱的方法是總是用引用來傳遞對象或者對象賦值. 這不僅僅改進了運行速度(更少的數(shù)據(jù)拷貝), 而且可以對像我這樣的老狗而言使語義更加可預(yù)測.

在構(gòu)造函數(shù)中對$this使用引用

   在一個對象的構(gòu)造函數(shù)里初始化作為其他對象發(fā)現(xiàn)者(Observer6)的對象是一個常見的模式. 下面幾行代碼便是一個示例: class Bettery { function Bettery() {…}; function AddObserver($method, &$obj) { $this->obs[] = array($obj, &$method) } function Notify(){…} } class Display { function Display(&$batt) { $batt->AddObserver("BatteryNotify",$this); } function BatteryNotify() {…} }

  但是, 這并不會正常工作, 如果你是這么實例化對象的:

$myBattery = new Battery();$myDisplay = new Display($myBattery);

  這么做的錯誤在于new時在構(gòu)造函數(shù)中使用$this并不會返回同一個對象. 反而會返回最近創(chuàng)建對象的一個拷貝. 即在調(diào)用AddObserver()時所傳送的對象于原對象不是同一個.然后當(dāng)Battery類嘗試通知所有它的觀察者(Observer)(通過調(diào)用他們的Notify方法)時, 它并不會調(diào)用我們所創(chuàng)建的Display類而是$this所代表的類(即我們所創(chuàng)建的Display類的拷貝). 因此如果Notify()方法更新了一些實例變量, 并不像我們所設(shè)想原Display類會被更新, 因為更新的其實是個拷貝.

  為了讓它工作, 你必須使構(gòu)造函數(shù)返回同一個對象, 正如與最初$this所象征的那樣. 可以通過添加&符號于Display的構(gòu)造, 如$myDisplay = & new Display($myBattery);一個直接的結(jié)果是任何Display類的Client必須了解Display的實現(xiàn)細節(jié). 事實上, 這會產(chǎn)生一個可能引起爭論的問題: 所有對象的構(gòu)建必須使用額外的&符號. 就我所說的基本上是安全的, 但忽略它可能會在某些時候得到不想要的如上述示例般的作用.

  在JpGraph中使用了另一種方法來解決. 即需要使用通過添加一個能安全的使用&$this引用的”Init()”方法的所謂二階段構(gòu)造來”new”一個對象(僅僅是因為在構(gòu)造函數(shù)中的$this引用返回對象的一個拷貝而不如所期望的那樣執(zhí)行). 因此上面的例子會如下實現(xiàn):

$myBattery = new Battery(); $myDisplay = new Display(); $myDisplay->Init($myBattery);

   如JPGraph.php中的”LinearScale”類.

使用foreach

   另外一個相似代碼卻不同結(jié)果的問題是”foreach”結(jié)構(gòu)的問題. 研究一下下面的二個循環(huán)結(jié)構(gòu)的不同版本.

// Version 1foreach( $this->plots as $p ){ $p->Update();}…// Version 2for( $i=0; $i<count($this->plots); ++$i ) {$this->plots[$i]->Update();}

  現(xiàn)在是一個價值10美元的問題: version1==version2?

  令人驚訝的答案是:No! 這是細小卻是關(guān)鍵的不同. 在Version 1中, Update()方法將作用于”plots[]”數(shù)組中對象的副本. 因此數(shù)組中原來的對象并不會被更新.

  在Version 2中Update()方法將如預(yù)期的作用于”plots[]”數(shù)組中的對象.

  正如第一部分所陳述的, 這是PHP將對象實例作為對象本身來處理而非作為對象引用的結(jié)果.

譯注:

  1. OO: Object-Oriented, 面向?qū)ο?

  2. 原文并無C#, 全因Binzy的個人愛好.

  3. Semantic在本文中被譯為”語義”, 如有任何建議請和Binzy聯(lián)系.

  4. C++中有一本著名的”C++ Gotchas”.

  5. 這里的類應(yīng)該是指Instance, 即實例.

  6. 可參見”[GoF95]”, 即”Design Patterns”.

  7. 有個挺有趣的關(guān)于交易的小故事:

  有人用60美元買了一匹馬, 又以70美元的價錢賣了出去;然后, 他又用80美元把它買回來, 最后以90美元的價錢賣出.在這樁馬的交易中, 他? (A)賠了10美元; (B)收支平衡; (C)賺了10美元;(D)賺了20美元; (E)賺了30美元.

  這是美國密執(zhí)安大學(xué)心理學(xué)家梅爾和伯克要大學(xué)生們計算的一個簡單的算術(shù)題.結(jié)果只有不到40%的大學(xué)生能夠作出正確答案, 多數(shù)人認為只賺了10美元.其實, 問題的條件十分明確, 這是兩次交易, 每次都賺10美元, 而很多人卻錯誤地認為當(dāng)他用80美元買回來時己經(jīng)虧損了10美元. 有趣的是, 同一問題, 以另一種方式提出來:有一個人用60美元買了一匹白馬, 又以70元的值賣出去;然后, 用80美元買了一匹黑馬, 又以90美元的值賣出去.在這樁買賣馬的交易中, 他____(把同樣的五個選擇羅列出來).這時, 另一組大學(xué)生在回答上述問題時, 結(jié)果大家都答對了.

  在PHP5中對象模型的確是更加正確和先進了。甚至是array這樣的函數(shù)在傳遞對象參數(shù)的時候也進行引用而非拷貝.以下php5下的Observer模式示例代碼可說明. 但很多的PHP程序員并沒有意識到PHP4中對象的問題.

[Ctrl+A 全部選擇 然后拷貝]

  正如Mr.Perrson說的,本文的目的是給使用java,.net的程序員在使用PHP4時的建議。

出處:CSDN
責(zé)任編輯:cjj

◎進入論壇網(wǎng)絡(luò)編程版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
ExpressionEngine模板設(shè)計大賽
PHP5 安裝方法
學(xué)習(xí)使用PHP數(shù)組
[php]一次編寫,隨處運行
[PHP]超越模板引擎
作者文章
PHP4之真OO
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計比賽 網(wǎng)頁制作 web標(biāo)準(zhǔn) 用戶體驗 UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點最新 站點最新列表
周大!熬•自然”設(shè)計大賽開啟
國際體驗設(shè)計大會7月將在京舉行
中國國防科技信息中心標(biāo)志征集
云計算如何讓安全問題可控
云計算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機會
阿里行云
云手機年終巨獻,送禮標(biāo)配299起
阿里巴巴CTO王堅的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機主題設(shè)計大賽
欄目最新 欄目最新列表
淺談JavaScript編程語言的編碼規(guī)范
如何在illustrator中繪制臺歷
Ps簡單繪制一個可愛的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡單的作品展示頁面
CSS定位機制之一:普通流
25個最佳最閃亮的Eclipse開發(fā)項目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule

藍色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點的原創(chuàng)文章,但原作者和來自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請不要盜鏈到本站,且不準(zhǔn)打上各自站點的水印,亦不能抹去我站點水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計作品,如需使用,請與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請與我們聯(lián)系,我們將立即刪除修改。

您的評論
用戶名:  口令:
說明:輸入正確的用戶名和密碼才能參與評論。如果您不是本站會員,你可以注冊 為本站會員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯誤,請用報告錯誤,以利文檔及時修改。
不評分 1 2 3 4 5
注意:請不要在評論中含與內(nèi)容無關(guān)的廣告鏈接,違者封ID
請您注意:
·不良評論請用報告管理員,以利管理員及時刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國的各項有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評論管理人員有權(quán)保留或刪除其管轄評論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評論文檔 | 報告錯誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計之道
《Flex 4.0 RIA開發(fā)寶典》
《贏在設(shè)計》
犀利開發(fā)—jQuery內(nèi)核詳解與實踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2