亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP4之真OO

2019-09-08 23:11:28
字體:
供稿:網(wǎng)友
本文的作者Johan Persson是PHP中著名的JpGraph圖表類庫的開發(fā)者. 本文是作者對于在PHP4中進(jìn)行面向?qū)ο箝_發(fā)時需要注意的幾個小問題的總結(jié).
翻譯: Binzy Wu [Mail: Binzy at JustDN dot COM], 水平有限, 歡迎探討. 2004-2-4

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

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

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

接下來的兩部分用于闡述二個小的例子, 在這二個例子中拷貝語義也許會令你驚訝.

要時刻牢記重要的是一個類的變量不是一個指向類的指針而是實際的類自己本身[5]. 大多數(shù)問題引發(fā)自對于賦值操作符(=)的誤解, 即以為是給一個對象一個別名, 而實際上卻是一個新的拷貝. 例如假設(shè)$myObj是某個類的實例, 并且它有一個Set()方法. 那么下面的代碼也許不會像一個C++(或者Java)程序員所期望的那樣工作.

function SomeFunction($aObj) { $aObj->Set(10); }

SomeFunction ($myObj);



那么現(xiàn)在, 很容易便會認(rè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ù))或直接的問題.

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

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

在一個對象的構(gòu)造函數(shù)里初始化作為其他對象發(fā)現(xiàn)者(Observer[6])的對象是一個常見的模式. 下面幾行代碼便是一個示例:

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)細(xì)節(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 1
foreach( $this->plots as $p )
{
$p->Update();
}



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



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

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

:本文英文原版地址:http://www.aditus.nu/jpgraph/jpg_phpoo.php
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
暖暖日本在线观看| 国产精品超碰97尤物18| 青娱乐国产91| 国产精品美女视频免费观看软件| 国产欧美一级| 国产精品天堂蜜av在线播放| 国产成人99久久亚洲综合精品| 国产日本一区二区三区| 亚洲精品一区二区在线看| 四虎影视成人精品国库在线观看| 成人免费观看av| 伊人久久久久久久久久| 久久久久中文| 免费观看在线色综合| 婷婷激情五月综合| 亚洲va久久久噜噜噜无码久久| 天堂网av成人| 一个色妞综合视频在线观看| 91视频一区二区三区| 久久精品在线免费视频| 国产精品中文字幕亚洲欧美| 成人av在线网| 久久精品国内一区二区三区水蜜桃| 伊人久久亚洲综合| 亚洲精品女人| 成人福利av| 日日夜夜天天操| 亚洲图区综合| 精品蜜桃传媒| 久久午夜无码鲁丝片午夜精品| 欧美三级又粗又硬| 99久久99| 欧美色婷婷天堂网站| 成人午夜视频在线观看免费| 久色视频在线观看| 国产精品国产三级国产在线观看| 一区二区高清| 黄色免费看网站| 国产免费一区二区三区四在线播放| 国产亚洲精品久久久网站好莱| 久久机热这里只有精品| 中文字幕成人在线视频| 久久久久久亚洲精品| 99国内精品久久久久| 美女福利一区二区| 99精品欧美一区二区三区| 国产成人手机高清在线观看网站| 国产一级免费观看| 亚洲品质自拍| 亚洲在线第一页| 99久久综合99久久综合网站| 四虎海外永久免费网址| 久久黄色av网站| 97人人澡人人爽| 国产乱理伦片a级在线观看| 国产精品无码久久久久| 色婷婷综合久色| 91九色丨porny丨极品女神| 国产在线不卡一卡二卡三卡四卡| 一区二区三区视频播放| 神马久久影视大全| 啪啪av大全导航福利网址| 在线a免费观看| 欧美一区二区少妇| 日本wwwwwww| 久久国产精品影片| 亚洲电影欧美电影有声小说| 亚洲九九在线| 污黄视频在线观看| 在线免费一区二区| 男人的天堂在线视频免费观看| 日韩一区二区视频| 国产香蕉精品视频| 亚洲国产欧洲综合997久久| 一区精品在线| 亚洲美女黄网| 九九九视频在线观看| 国产麻豆麻豆| 国产精品二区视频| 亚洲国产日韩一区二区| 亚洲欧洲午夜一线一品| 欧美日韩影视| 午夜免费在线| 26uuu另类亚洲欧美日本老年| 亚洲一区3d动漫同人无遮挡| 天天操夜夜欢| 蜜臀一区二区三区精品免费视频| 久久人人爽人人爽爽久久| chinese叫床对白videos| 久久久久九九九九| hs视频在线观看| 欧美综合色免费| 手机在线免费观看av| 国产永久精品大片wwwapp| 亚洲精品国产高清久久伦理二区| www日韩视频| 欧美丝袜一区二区| 亚洲视频重口味| 澳门av一区二区三区| 色综合久久久久无码专区| 99久久精品国产精品久久| 在线看一级片| 亚洲第一二三四五区| 午夜av免费在线观看| 日韩欧美国产三级电影视频| 播放灌醉水嫩大学生国内精品| 欧美性色黄大片手机版| 国产欧美一区二区在线观看| 日本人成精品视频在线| 日韩最新中文字幕电影免费看| 亚洲日韩视频| 国产精品视频久久久久久久| 免费精品一区| 国产免费999| 亚洲一区二区三区视频在线| 日本我和搜子同居的日子高清在线| 久久免费看少妇高潮| 男女午夜视频在线观看| 在线观看欧美一区二区| 电影在线观看一区| 欧美日韩亚洲国内综合网| 亚洲欧美日本韩国| 刘玥91精选国产在线观看| 久久久久亚洲AV成人网人人小说| 国产在线视频欧美一区二区三区| 亚洲精品色婷婷福利天堂| 精品国产伦一区二区三区观看方式| 欧美成人黄色网| 国产精彩视频在线观看| 亚洲天堂网av在线| 亚洲天堂av资源在线观看| 欧美大片免费观看| 成人软件网18免费视频| 性欧美18+| 日本女优在线视频一区二区| 久久av在线看| 2021国产在线| 教室别恋欧美无删减版| 91一区二区三区在线播放| 日韩电影在线免费| 国内精彩免费自拍视频在线观看网址| 国产又粗又猛又爽又黄av| 男女男精品视频网站| 日韩电影在线观看一区二区| 国产欧美一区二区三区精品酒店| 精品av中文字幕在线毛片| 中文字幕一区二区三区日韩精品| 久久久成人免费视频| 亚洲一区 二区| 国产男女猛烈无遮挡免费视频| 成人免费一区二区三区在线观看| 红桃视频成人在线观看| aa片在线观看视频在线播放| 在线香蕉视频| 亚洲理论电影在线观看| 欧美午夜美女看片| 免费下载黄色软件| 中文一区一区三区免费在线观看| 人偷久久久久久久偷女厕| 国产精品日韩欧美一区二区三区| 天堂在线中文视频| 日韩电影免费观看高清完整版| h狠狠躁死你h高h| 成年人性生活视频| 成人免费视频国产免费观看| 亚洲国产成人在线观看| 暖暖日本在线观看| 久久综合久久综合久久| 激情综合网址| 亚洲警察之高压线| 日本精品久久久久中文| 日本www在线观看| 2020国产在线视频| 成视人a免费观看视频| 久久综合久久综合九色| 极品魔鬼身材女神啪啪精品| 91麻豆精品国产自产在线观看一区| 欧美日韩精品一本二本三本| 99视频网站| 欧美 日韩 国产 成人 在线观看| 亚洲国产综合久久精品小蝴蝶| 中文字幕免费精品| 成人黄色片免费| 日韩深夜影院| 欧美大陆国产| 成人性生活免费看| 9797在线看片亚洲精品| 男女啪啪免费观看| 91亚洲国产成人精品一区二区三| 视频二区欧美毛片免费观看| 欧美特黄aaa| 青青热久免费精品视频在线18| 成人免费三级在线| 欧美性天天影院| 久久久久久久久岛国免费| 激情久久av一区av二区av三区| 蜜乳av一区二区| 亚洲色图校园春色| 天堂网在线免费观看| 麻豆传媒在线看| 大地资源网在线观看免费官网| 91中文精品字幕在线视频| 日韩a一区二区| 亚洲一区在线看| 亚洲春色h网| 91精品在线免费视频| 久草在线免费资源| jizzjizz在线| 91麻豆国产自产在线观看| 91免费人成网站在线观看18| 欧美日韩亚洲一区在线观看| 国产午夜精品美女视频明星a级| 精品一区二区三孕妇视频| 亚洲激精日韩激精欧美精品| 91网站视频在线观看| 曰韩不卡视频| 国产成人鲁色资源国产91色综| 黄网址在线播放免费| 精品国产精品久久一区免费式| 国产精品久久一区二区三区| 国产女优裸体网站| 一区二区三区免费看| 色播五月激情综合网| 亚洲欧美日韩精品久久奇米色影视| 亚洲欧美一二三| 非洲黑人最猛性xxxx交| 亚洲另类春色国产| 国产成人亚洲综合91| 精品人妻无码一区二区三区蜜桃一| 两个人的视频www国产精品| 久cao在线| www视频免费| 久久久电影免费观看完整版| 国产乱码精品一区二三区蜜臂| 欧美一区二区视频在线播放| 日本黄色精品| 亚洲成人动漫在线观看| 日本精品一区二区三区在线| 欧美激情精品久久久久久免费| 伊人久久大香线蕉无限次| 男人天堂一区二区| 日韩 欧美 视频| 一区二区在线观看免费视频播放| 成年人网站在线观看视频| 日韩精品成人一区二区在线| 成人黄色激情网| 久草视频手机在线观看| 日本五级黄色片| 一级黄色大片免费观看| 狠狠综合久久av一区二区蜜桃| 国产国语**毛片高清视频| 久久久噜噜噜久噜久久| 中文字幕一区二区精品| 国内精品久久久久影院 日本资源| 精品国产乱码久久久久久1区2匹| 精品影片在线观看的网站| 91麻豆精品国产91久久久更新时间| 亚洲午夜一级| 亚洲午夜羞羞片| 99久久久国产精品美女| 三级网站在线免费观看| 麻豆久久久久久久| 亚洲石原莉奈一区二区在线观看| 久草热8精品视频在线观看| 黄色在线网站噜噜噜| 韩国三级丰满少妇高潮| 91大神xh98hx在线播放| 最新亚洲激情| 天天操夜夜草| 日韩av片在线免费观看| 亚洲性猛交xxxx乱大交| 触手亚洲一区二区三区| 亚洲精品三区| 中文字幕二区三区| 男女羞羞视频在线观看| 久久久久久久久综合影视网| 久久久久久影院| 婷婷久久青草热一区二区| 激情五月色综合亚洲小说| 国产精品三p一区二区| 黄色国产网站在线播放| 男人日女人逼逼| 欧美性猛交内射兽交老熟妇| 国产一区二区视频在线免费观看| 欧美亚洲三级| 高跟丝袜一区二区三区| 一区二区三区网址| 亚洲精品第二页| 国产精品亚洲人在线观看| 美女啪啪无遮挡免费久久网站| 中文字幕精品无码一区二区| 欧洲视频在线免费观看| 日韩精品久久久免费观看| 欧美乱做爰xxxⅹ久久久| 日本黄视频网站| 91精品无人成人www| 操人视频在线观看欧美| 最好看的日本字幕mv视频大全| 成人日批视频| av永久不卡| 亚洲成人xxx| 国产欧美综合精品一区二区| 在线视频91p| 女女同性女同一区二区三区91| 国产精品欧美久久久久无广告| 成人国产亚洲欧美成人综合网| 成人直播大秀| h视频免费在线观看| 555夜色666亚洲国产免| 国产乱码精品一区二区三区五月婷| 色成年激情久久综合| www555久久| 天天摸日日摸狠狠添| 寂寞护士中文字幕mp4| 一区二区理论电影在线观看| 国产999久久久| 国产精品扒开腿做爽爽爽软件| 亚洲熟妇无码另类久久久| 91蜜桃在线观看| 视频二区欧美| 丰满人妻一区二区三区无码av| 成年人黄色电影| 亚洲 欧美 日韩 国产综合 在线| 日韩一区二区高清| 国产一级黄色电影| 天天鲁一鲁摸一摸爽一爽| 美乳美女在线观看香蕉| 国产福利精品一区二区|