PHP中實(shí)現(xiàn)面向?qū)ο缶幊蹋ㄉ希?/h1>
Jun 21, 2016 am 09:15 AM
function
obj
php
this
編程|對(duì)象
這篇文章介紹在PHP的面向?qū)ο缶幊蹋∣OP)。我將演示如何用面向?qū)ο蟮母拍罹幊鲚^少的代碼但更好的程序。祝大家好運(yùn)。
面向?qū)ο缶幊痰母拍顚?duì)每一個(gè)作者來(lái)說(shuō)都有不同的看法,我提醒一下一個(gè)面向?qū)ο笳Z(yǔ)言應(yīng)有的東西:
- 數(shù)據(jù)抽象和信息隱藏
- 繼承
- 多態(tài)性
在PHP中使用類(lèi)進(jìn)行封裝的辦法:
class Something {
// In OOP classes are usually named starting with a cap letter.
var $x;
function setX($v) {
// Methods start in lowercase then use lowercase to seprate
// words in the method name example getValueOfArea()
$this->x=$v;
}
function getX() {
return $this->x;
}
}
?>
當(dāng)然你可以用你自己的辦法,但有一個(gè)標(biāo)準(zhǔn)總是好的。
PHP中類(lèi)的數(shù)據(jù)成員使用 "var" 定義,數(shù)據(jù)成員是沒(méi)有類(lèi)型直到被賦值。一個(gè)數(shù)據(jù)成員可能是一個(gè) integer、數(shù)組、聯(lián)合數(shù)組(associative array)或甚至對(duì)象(object). 方法在類(lèi)里定義成函數(shù),在方法里存取數(shù)據(jù)成員,你必須使用$this->name 這樣的辦法,否則對(duì)方法來(lái)說(shuō)是一個(gè)函數(shù)的局部變量。
使用 new 來(lái)創(chuàng)建一個(gè)對(duì)象
$obj = new Something;
然后使用成員函數(shù)
$obj->setX(5);
$see = $obj->getX();
setX 成員函數(shù)將 5 賦給對(duì)象(而不是類(lèi))obj 中成員變量, 然后 getX 返回值 5.
你也可以用對(duì)象引用來(lái)存取成員變量,例如:$obj->x=6; 然而,這不一種好的面向?qū)ο缶幊痰姆椒?。我?jiān)持你應(yīng)使用成員函數(shù)來(lái)設(shè)置成員變量的值和通過(guò)成員函數(shù)來(lái)讀取成員變量。如果你認(rèn)為成員變量是不可存取的除了使用成員函數(shù)的辦法,你將成為一個(gè)好的面向?qū)ο蟪绦騿T。 但不幸的是PHP本身沒(méi)有辦法聲明一個(gè)變量是私有的,所以允許糟糕的代碼存在。
在 PHP 中繼承使用 extend 來(lái)聲明。
class Another extends Something {
var $y;
function setY($v) {
// Methods start in lowercase then use lowercase to seperate
// words in the method name example getValueOfArea()
$this->y=$v;
}
function getY() {
return $this->y;
}
}
?>
這樣類(lèi) "Another" 的對(duì)象擁有父類(lèi)的所用成員變量及方法函數(shù),再加上自己的成員變量及成員函數(shù)。如:
$obj2=new Another;
$obj2->setX(6);
$obj2->setY(7);
多重繼承不被支持,所以你不能讓一個(gè)類(lèi)繼承多個(gè)類(lèi)。
在繼承類(lèi)中你可以重新定義來(lái)重定義方法,如果我們?cè)?"Another" 重新定義 getX,那么我們不再能存取 "Something" 中的成員函數(shù) getX. 同樣,如果我們?cè)诶^承類(lèi)中聲明一個(gè)和父類(lèi)同名的成員變量,那么繼承類(lèi)的變量將隱藏父類(lèi)的同名變量。
你可以定義一個(gè)類(lèi)的構(gòu)造函數(shù), 構(gòu)造函數(shù)是和類(lèi)同名的成員函數(shù),在你創(chuàng)建類(lèi)的對(duì)象時(shí)被調(diào)用。
class Something {
var $x;
function Something($y) {
$this->x=$y;
}
function setX($v) {
$this->x=$v;
}
function getX() {
return $this->x;
}
}
?>
所以可以用如下方法創(chuàng)建對(duì)象:
$obj=new Something(6);
構(gòu)造函數(shù)自動(dòng)賦值 5 給成員變量 x, 構(gòu)造函數(shù)和成員函數(shù)都是普通的PHP函數(shù),所以你可以使用缺省參數(shù)。
function Something($x="3",$y="5")
然后:
$obj=new Something(); // x=3 and y=5
$obj=new Something(8); // x=8 and y=5
$obj=new Something(8,9); // x=8 and y=9
缺省參數(shù)的定義方法和 C++ 一樣,因此你不能傳一個(gè)值給 Y 但讓 X 取缺省值,實(shí)參的傳遞是從左到右,當(dāng)沒(méi)有更多的實(shí)參時(shí)函數(shù)將使用缺省參數(shù)。
只有當(dāng)繼承類(lèi)的構(gòu)造函數(shù)被調(diào)用后,繼承類(lèi)的對(duì)象才被創(chuàng)建,父類(lèi)的構(gòu)造函數(shù)沒(méi)有被調(diào)用,這是PHP不同其他面向?qū)ο笳Z(yǔ)言的特點(diǎn),因?yàn)闃?gòu)造函數(shù)調(diào)用鏈?zhǔn)敲嫦驅(qū)ο缶幊痰奶攸c(diǎn)。如果你想調(diào)用基類(lèi)的構(gòu)造函數(shù),你不得不在繼承類(lèi)的構(gòu)造函數(shù)中顯式調(diào)用它。這樣它能工作是因?yàn)樵诶^承類(lèi)中父類(lèi)的方法全部可用。
function Another() {
$this->y=5;
$this->Something(); //explicit call to base class constructor.
}
?>
在面向?qū)ο缶幊讨幸环N好的機(jī)制是使用抽象類(lèi),抽象類(lèi)是一種不能實(shí)例化而是用來(lái)給繼承類(lèi)定義界面的類(lèi)。設(shè)計(jì)師經(jīng)常使用抽象類(lèi)來(lái)強(qiáng)制程序員只能從特定的基類(lèi)來(lái)繼承,所以就能確定新類(lèi)有所需的功能,但在PHP中沒(méi)有標(biāo)準(zhǔn)的辦法做到這一點(diǎn),不過(guò):
如果你在定義基類(lèi)是需要這個(gè)特點(diǎn),可以通過(guò)在構(gòu)造函數(shù)中調(diào)用 "die",這樣你就可以確保它不能實(shí)例化,現(xiàn)在定義抽象類(lèi)的函數(shù)并在每個(gè)函數(shù)中調(diào)用 "die",如果在繼承類(lèi)中程序員不想重定義而直接調(diào)用基類(lèi)的函數(shù),將會(huì)產(chǎn)生一個(gè)錯(cuò)誤。
此外,你需要確信因?yàn)镻HP沒(méi)有類(lèi)型,有些對(duì)象是從基類(lèi)繼承而來(lái)的繼承類(lèi)創(chuàng)建的,因此增加一個(gè)方法在基類(lèi)來(lái)辨別類(lèi)(返回 "一些標(biāo)識(shí)")并驗(yàn)證這一點(diǎn),當(dāng)你收到一個(gè)對(duì)象作為參數(shù)派上用場(chǎng)。 但對(duì)于一個(gè)惡棍程序沒(méi)用辦法,因?yàn)樗梢栽诶^承類(lèi)中重定義此函數(shù),通常這種辦法只對(duì)懶惰的程序員奏效。當(dāng)然,最好的辦法是防止程序接觸到基類(lèi)的代碼只提供界面。
重載在PHP中不被支持。在面向?qū)ο缶幊讨心憧梢酝ㄟ^(guò)定義不同參數(shù)種類(lèi)和多少來(lái)重載一個(gè)同名成員函數(shù)。PHP是一種松散的類(lèi)型語(yǔ)言,所以參數(shù)類(lèi)型重載是沒(méi)有用的,同樣參數(shù)個(gè)數(shù)不同的辦法重載也不能工作。
有時(shí)候,在面向?qū)ο缶幊讨兄剌d構(gòu)造函數(shù)很有用,所以你能以不同的方式創(chuàng)建不同的對(duì)象(通過(guò)傳遞不同的參數(shù)個(gè)數(shù))。一個(gè)小巧門(mén)可以做到這一點(diǎn):
class Myclass {
function Myclass() {
$name="Myclass".func_num_args();
$this->$name();
//Note that $this->$name() is usually wrong but here
//$name is a string with the name of the method to call.
}
function Myclass1($x) {
code;
}
function Myclass2($x,$y) {
code;
}
}
?>
通過(guò)這種辦法可以部分達(dá)到重載的目的。
$obj1=new Myclass(1); //Will call Myclass1
$obj2=new Myclass(1,2); //Will call Myclass2
感覺(jué)還不錯(cuò)!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

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

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

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

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

熱門(mén)話題

PHP設(shè)置的關(guān)鍵在於明確安裝方式、配置php.ini、連接Web服務(wù)器及啟用必要擴(kuò)展。 1.安裝PHP:Linux用apt、Mac用Homebrew、Windows推薦XAMPP;2.配置php.ini:調(diào)整錯(cuò)誤報(bào)告、上傳限制等並重啟服務(wù)器;3.搭配Web服務(wù)器:Apache通過(guò)mod_php,Nginx使用PHP-FPM;4.安裝常用擴(kuò)展:如mysqli、json、mbstring等以支持完整功能。

易於效率,啟動(dòng)啟動(dòng)tingupalocalserverenverenvirestoolslikexamppandacodeeditorlikevscode.1)installxamppforapache,mysql,andphp.2)uscodeeditorforsyntaxssupport.3)

PHPblockcommentsareusefulforwritingmulti-lineexplanations,temporarilydisablingcode,andgeneratingdocumentation.Theyshouldnotbenestedorleftunclosed.BlockcommentshelpindocumentingfunctionswithPHPDoc,whichtoolslikePhpStormuseforauto-completionanderrorche

註釋不能馬虎是因?yàn)樗忉尨a存在的原因而非功能,例如兼容老接口或第三方限制,否則看代碼的人只能靠猜。必須加註釋的地方包括複雜的條件判斷、特殊的錯(cuò)誤處理邏輯、臨時(shí)繞過(guò)的限制。寫(xiě)註釋更實(shí)用的方法是根據(jù)場(chǎng)景選擇單行註釋或塊註釋?zhuān)瘮?shù)、類(lèi)、文件開(kāi)頭用文檔塊註釋說(shuō)明參數(shù)與返回值,並保持註釋更新,對(duì)複雜邏輯可在前面加一行概括整體意圖,同時(shí)不要用註釋封存代碼而應(yīng)使用版本控制工具。

寫(xiě)好PHP註釋的關(guān)鍵在於明確目的與規(guī)範(fàn),註釋?xiě)?yīng)解釋“為什麼”而非“做了什麼”,避免冗餘或過(guò)於簡(jiǎn)單。 1.使用統(tǒng)一格式,如docblock(/*/)用於類(lèi)、方法說(shuō)明,提升可讀性與工具兼容性;2.強(qiáng)調(diào)邏輯背後的原因,如說(shuō)明為何需手動(dòng)輸出JS跳轉(zhuǎn);3.在復(fù)雜代碼前添加總覽性說(shuō)明,分步驟描述流程,幫助理解整體思路;4.合理使用TODO和FIXME標(biāo)記待辦事項(xiàng)與問(wèn)題,便於後續(xù)追蹤與協(xié)作。好的註釋能降低溝通成本,提升代碼維護(hù)效率。

ToinstallPHPquickly,useXAMPPonWindowsorHomebrewonmacOS.1.OnWindows,downloadandinstallXAMPP,selectcomponents,startApache,andplacefilesinhtdocs.2.Alternatively,manuallyinstallPHPfromphp.netandsetupaserverlikeApache.3.OnmacOS,installHomebrew,thenrun'bre

寫(xiě)好註釋的關(guān)鍵在於說(shuō)明“為什麼”而非僅“做了什麼”,提升代碼可讀性。 1.註釋?xiě)?yīng)解釋邏輯原因,例如值選擇或處理方式背後的考量;2.對(duì)複雜邏輯使用段落式註釋?zhuān)爬ê瘮?shù)或算法的整體思路;3.定期維護(hù)註釋確保與代碼一致,避免誤導(dǎo),必要時(shí)刪除過(guò)時(shí)內(nèi)容;4.在審查代碼時(shí)同步檢查註釋?zhuān)瑏K通過(guò)文檔記錄公共邏輯以減少代碼註釋負(fù)擔(dān)。

PHP註釋代碼常用方法有三種:1.單行註釋用//或#屏蔽一行代碼,推薦使用//;2.多行註釋用/.../包裹代碼塊,不可嵌套但可跨行;3.組合技巧註釋如用/if(){}/控制邏輯塊,或配合編輯器快捷鍵提升效率,使用時(shí)需注意閉合符號(hào)和避免嵌套。
