搜尋
首頁後端開發php教程開發大型PHP專案的方法_PHP教程

開發大型PHP專案的方法_PHP教程

Jul 21, 2016 pm 04:09 PM
oopphp大型物件開發方法目的程式設計面向


開發大型PHP專案的方法 這裡介紹了在PHP中的物件導向程式設計(OOP,Object Oriented Programming)。將向你示範如何透過使用一些OOP的概念和PHP的技巧來減少編碼和提高品質。祝你好運!

物件導向程式設計的概念:
不同的作者之間說法可能不一樣,但是一個OOP語言必須有以下幾個方面:

抽象資料類型和資訊封裝
繼承
多態性

在PHP中是透過類別來完成封裝的:

程式碼:

class Something {
/ / 在OOP類別中,通常第一個字元為大寫
var $x;
function setX($v) {
// 方法開始為小寫單詞,然後使用大寫字母來分隔單詞,例如getValueOfArea()
$this->x=$v;
}
function getX() {
return $this->x;
}
}
?>



當然你可以按自已的喜好定義,但最好保持一種標準,這樣會更有效。

資料成員在類別中使用"var"宣告來定義,在給資料成員賦值之前,它們是沒有類型的。一個資料成員可以是一個整數,一個數組,一個相關數組(associative array)或一個物件。

方法在類別中被定義成函數形式,在方法中存取類別成員變數時,你應該使用$this->name,否則對一個方法來說,它只能是局部變數。

使用new運算子來建立一個物件:

$obj=new Something;

然後你可以使用成員函數通過:

$obj- >setX(5);
$see=$obj->getX();

在這個例子中,setX成員函數將5賦值為物件的成員變數x(不是類別的),然後getX傳回它的值5。

你可以像:$obj->x=6那樣透過類別引用方式來存取資料成員,這不是一個很好的OOP習慣。我強烈建議透過方法來存取成員變數。如果你把成員變數看成是不可處理的,並且只透過物件句柄來使用方法,你將是一 個好的OOP程式設計師。不幸的是,PHP不支援聲明私有成員變量,所以不良程式碼在PHP中也是允許的。

繼承在PHP中很容易實現,只要使用extend關鍵字。

程式碼:

class Another extends Something {
var $y;
function setY($v) {
$this->y =$v;
}
function getY() {
return $this->y;
}
}
?>



?>



?>



?>



?>



?>



"Another"類別的物件現在擁有了父類別(Something)的全部的資料成員及方法,而且還加上了自已的資料成員和方法。

可以用

程式碼:

$obj2=new Something;
$obj2->setX(6);
$obj2->setY( 7);



PHP現在還不支援多重繼承,所以你不能從兩個或兩個以上類別衍生出新的類別來。

你可以在衍生類別中重定義一個方法,如果我們在"Another"類別中重定義了getX方法,我們就不能使 用"Something"中的getX方法了。如果你在衍生類別中宣告了一個與基派同名的資料成員,那麼當你處理它時, 它將「隱藏」基底類別的資料成員。

你可以在你的類別中定義建構子。建構子是一個與類別名稱同名的方法,當你建立一個類別的物件時會被調用,例如:

程式碼:

class Something {
var $x;
function Something($y) {
$this->x=$y;
}
function setX($v) {
$this->x= $v;
}
function getX() {
return $this->x;
}
}
?>



所以你可以建立一個對象,透過:

$obj=new Something(6);

建構子會自動地把6賦值給資料變數x。建構函數和方法都是普通的PHP函數,所以你可以使用預設參數。

function Something($x="3",$y="5")

接著:

$obj=new Something(); // x=3和 y=5 $obj=new Something(8); // x=8 和 y=5 $obj=new Something(8,9); // x=8 and y=9 缺省參數使用C 的方式,所以你不能忽略Y的值,而給X一個缺省參數,參數是從左到右賦值的,如果傳入的參數少於要求的參數時,其作的將使用預設參數。 當一個衍生類別的物件被建立時,只有它的建構子被調用,父類別的建構子沒被調用,如果你想調用基底類別的建構函數,你必須要在衍生類別的構造函數中顯示呼叫。可以這樣做是因為在衍生類別中所有父類別的方法都是可用的。 程式碼: function Another() { $this->y=5; $this->Something(); //顯示呼叫基底類別建構子} ?> OOP的一個很好的機制是使用抽象類別。抽象類別是不能實例化,只能提供給衍生類別一個介面。設計者通常使用抽象類別來強迫程式設計師從基底類別派生,這可以確保新的類別包含一些期待的功能。在PHP中沒有標準的方法,但是:

如果你需要這個特性,可以透過定義基類,並在它的構造函數後加上"die" 的調用,這樣就可以保證基類是不可實例化的,現在在每一個方法(介面)後面加上"die" 語句,所以,如果一個程式設計師在衍生類別中沒有覆寫方法,將會引發一個錯誤。而且因為PHP 是無類型的,你可能需要確認一個物件是來自於你的基類的派生類,那麼在基類中增加一個方法來實義類的身份(傳回某種標識id),並且在你接收到一個物件參數時校驗這個值。當然,如果一個邪惡不好的程式設計師在衍生類別中覆蓋了這個方法,這種方法就不起作用了,不過一般問題多發現在懶惰的程式設計師身上,而不是邪惡的程式設計師。

當然,能夠讓基類對程式設計師無法看到是很好的,只要將介面印出來做他們的工作就可以了。

在PHP中沒有析構函數。

重載(與覆蓋不同)在PHP中不支援。在OOP中,你可以重載一個方法來實現兩個或重多的方法具有相同的名字,但是有不同數量或類型的參數(這要看語言)。 PHP 是一種鬆散類型的語言,所以透過型別重載不起作用,然而透過參數的個數不同來重載也不起作用。

有時在OOP中重載建構子非常好,這樣你可以透過不同的方法來建立物件(傳遞不同數量的參數)。在PHP
中實現它的技巧是:

代碼:

class Myclass {
function Myclass() {
$name=" Myclass".func_num_args();
$this->$name();
//注意$this->name()一般是錯誤的,但是在這裡$name是一個會被呼叫方法的名字
}
function Myclass1($x) {
code;
}
function Myclass2($x,$y) {
code;
}
}
?>



透過在類別中的額外的處理,使用這個類別對使用者是透明的:

$obj1=new Myclass('1') ; //將呼叫Myclass1

$obj2=new Myclass('1','2'); //將呼叫Myclass2

有時這個非常好用。

多態
多型是物件的一種能力,它可以在運作時刻根據傳遞的物件參數,決定呼叫哪一個物件的方法。例如,如果你有一個figure的類,它定義了一個draw的方法。並且衍生了circle和rectangle 類,在衍生類別中你覆寫了draw方法,你可能還有一個函數,它希望使用一個參數x,並且可以呼叫$x->draw() 。如果你有多態性,呼叫哪個draw方法就依賴你傳遞給這個函數的物件類型。

多態性在像PHP這樣的解釋語言(想像一下一個C 編譯器產生這樣的程式碼,你應該呼叫哪一個方法?你也不知道你擁有的物件是什麼類型的,好,這不是重點)是非常容易和自然的。所以PHP當然支援多態性。

程式碼:

function niceDrawing($x) {
//假設這是Board類別的一個方法
$x->draw() ;
}
$obj=new Circle(3,187);
$obj2=new Rectangle(4,5);
$board->niceDrawing($obj);
//將呼叫Circle的draw方法
$board->niceDrawing($obj2);
//將呼叫Rectangle的draw方法
?>



用PHP進行面向物件程式設計
一些"純化論者(purists)"可能會說PHP不是一個真正的物件導向的語言,這是事實。 PHP 是一個混合型語言,你可以使用OOP,也可以使用傳統的流程程式設計。然而,對於大型項目,你可能想/需要在PHP 中使用純的OOP去聲明類,而且在你的項目只用物件和類。

隨著專案越來越大,使用OOP可能會有幫助,OOP程式碼很容易維護,容易理解和重複使用。這些就是軟體工程
的基礎。在基於web的專案中應用這些概念就成為將來網站成功的關鍵。

PHP的高級OOP技術
在看過基本的OOP概念後,我就可以向你展示更高級的技術:

序列化(Serializing)
PHP不支援永久對象,在OOP中永久對像是可以在多個應用的引用中保持狀態和功能的對象,這意味著擁有將對象保存到一個文件或資料庫中的能力,並且可以在以後裝入對象。這就是所謂的序列化機制。 PHP 擁有序列化方法,它可以透過物件調用,序列化方法可以傳回物件的字串表示。然而,序列化只保存了物件的成員資料而不包話方法。

在PHP4中,如果你將物件序列化到字串$s中,然後釋放對象,接著反序列化物件到$obj,你可以繼續使用物件的方法!我不建議這樣做,因為(a)文件中沒有保證這種行為在以後的版本中仍然可以使用。 (b)這個可能導致誤解,當你把一個序列化後的版本儲存到磁碟並退出腳本時。當以後運行這個腳本時,你不能期待在反序列化一個物件時,物件的方法也會在那裡,因為字串表示根本就不包括方法。

總而言之,PHP 進行序列化對於保存物件的成員變數非常有用。 (你也可以將相關陣列和陣列序列化到一個檔案中)。

範例:

程式碼:

$obj=new Classfoo();
$str=serialize($obj);
//幾個月以後
//從磁碟裝入str
$obj2=unserialize($str)
?>



你恢復了成員數據,但是不包括方法(根據文檔所說)。這導致了只能透過類似於使用$obj2->x來訪問成員變數(你沒有別的方法!)的唯一辦法,所以不要在家裡嘗試它。

有一些辦法可以解決這個問題,我把它留著,因為對這篇簡潔的文章來說,他們太不好。

使用類別進行資料儲存
對於PHP和OOP一件非常好的事情就是,你可以很容易地定義一個類別來操作某件事情,並且無論何時你想用的時候都可以呼叫對應的類別。假設你有一個HTML表單,使用者可以透過選擇產品ID號碼來選擇一個產品。在資料庫中有產品的信息,你想把產品顯示出來,顯示它的價格等等。你擁有不同類型的產品,同一個動作可能對不同的產品有不同的意義。例如,顯示一個聲音可能意味著播放它,但是對於其它種類的產品可能意味著顯示一個存在資料庫中的圖片。你可以使用OOP或PHP來減少編碼並提高品質:

定義一個產品的類,定義它應該有的方法(例如:顯示),然後定義對每一種類型的產品的類,從產品類派後出來(SoundItem類,ViewableItem類,等等),覆蓋在產品類別中的方法,使它們按你的想法動作。

根據資料庫中每種產品的類型(type)欄位為類別命名,一個典型的產品表可能有(id, type, price, description, 等等欄位)...然後在處理腳本中,你可以從資料庫中取出type值,然後實例化一個名為type的物件:


程式碼:

$obj=new $type ();
$obj->action();
?>



這是PHP的一個非常好的特性,你可以不用考慮物件的類型,調用$obj的顯示方法或其它的方法。使用這個技術,你不需要修改腳本去增加一個新類型的對象,只是增加一個處理它的類別。

這個功能很強大,只要定義方法,而不去考慮所有物件的類型,在不同的類別中按不同的方法實現它們,然後在主腳本中對任意物件使用它們,沒有if. ..else,也不需要兩個程式設計師,只有高興。

現在你同意程式設計是容易的,維護是便宜的,可重複使用是真的嗎?

如果你管理一組程式設計師,分配工作就是很簡單的了,每個人可能負責一個類型的物件和處理它的類別。

可以透過這個技術實現國際化,根據使用者所選的語言欄位應用對應的類別就可以了,等等。


拷貝和克隆
當你創建一個$obj的對象時,你可以透過$obj2=$obj來拷貝對象,新的對像是$obj的一個拷貝(不是一個引用),所以它具有$obj在當時的狀態。有時候,你不想這樣,你只是想產生一個像obj類別一樣的一個新的對象,可以透過使用new語句來呼叫類別的建構子。在PHP中也可以透​​過序列化,和一個基底類別來實現,但所有的其它類別都要從基底類別衍生出來。


進入危險區域
當你序列化一個對象,你會得到某種格式的字符串,如果你感興趣,你可以調究它,其中,字符串中有類的名字(太好了!),你可以把它取出來,象:

代碼:

$herring=serialize($obj);
$vec=explode(':',$herring);
$nam=str_replace(""",'',$vec[2]);
?>



所以假設你創建了一個"Universe"的類,並且強制所有的類都必須從universe擴展,你可以在universe中定義一個clone的方法,如下:

代碼:

class Universe {
function clone() {
$herring=serialize($this);
$vec=explode(':',$herring);
$nam=str_replace(""",'',$vec[2]);
$ret=new $nam;
return $ret;
}
}
//然後
$obj=new Something();
//從Universe擴充
$other=$obj->clone();
?>



你所得到的是一個新的Something類別的對象,它同使用new方法,調用構造函數創建出的對像一樣。我不知道這個對你是否有用,但是Universe類別可以知道衍生類別的名字是一個好的經驗。想像是唯一的限制。 (出處:風閃)

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/314509.htmlTechArticle開發大型PHP專案的方法這裡介紹了在PHP中的物件導向程式設計(OOP,Object Oriented Programming)。將向你示範如何透過使用一些OOP的概念和PHP的技巧來...
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
您什麼時候使用特質與PHP中的抽像類或接口?您什麼時候使用特質與PHP中的抽像類或接口?Apr 10, 2025 am 09:39 AM

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?Apr 10, 2025 am 09:38 AM

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。Apr 10, 2025 am 09:37 AM

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP如何安全地上載文件?PHP如何安全地上載文件?Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

什麼是無效的合併操作員(??)和無效分配運算符(?? =)?什麼是無效的合併操作員(??)和無效分配運算符(?? =)?Apr 10, 2025 am 09:33 AM

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

什麼是內容安全策略(CSP)標頭,為什麼重要?什麼是內容安全策略(CSP)標頭,為什麼重要?Apr 09, 2025 am 12:10 AM

CSP重要因為它能防範XSS攻擊和限制資源加載,提升網站安全性。 1.CSP是HTTP響應頭的一部分,通過嚴格策略限制惡意行為。 2.基本用法是只允許從同源加載資源。 3.高級用法可設置更細粒度的策略,如允許特定域名加載腳本和样式。 4.使用Content-Security-Policy-Report-Only頭部可調試和優化CSP策略。

什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用?什麼是HTTP請求方法(獲取,發布,放置,刪除等),何時應該使用?Apr 09, 2025 am 12:09 AM

HTTP請求方法包括GET、POST、PUT和DELETE,分別用於獲取、提交、更新和刪除資源。 1.GET方法用於獲取資源,適用於讀取操作。 2.POST方法用於提交數據,常用於創建新資源。 3.PUT方法用於更新資源,適用於完整更新。 4.DELETE方法用於刪除資源,適用於刪除操作。

什麼是HTTP,為什麼對Web應用程序至關重要?什麼是HTTP,為什麼對Web應用程序至關重要?Apr 09, 2025 am 12:08 AM

HTTPS是一種在HTTP基礎上增加安全層的協議,主要通過加密數據保護用戶隱私和數據安全。其工作原理包括TLS握手、證書驗證和加密通信。實現HTTPS時需注意證書管理、性能影響和混合內容問題。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境