PHP高階OOP技術演示

2022-10-06 06:24:09 字數 2639 閱讀 2345

序列化(serializing)

php不支援永久物件,在oop中永久物件是可以在多個應用的引用中保持狀態和功能的物件,這意味著擁有將物件儲存到乙個檔案或資料庫中的能力,而 且可以在以後裝入物件。這就是所謂的序列化機制。php 擁有序列化方法,它可以通過物件進行呼叫,序列化方法可以返回物件的字串表示。然而,序列化只儲存了物件的成員資料而不包話方法。

在 php4中,如果你將物件序列化到字串$s中,然後釋放物件,接著反序列化物件

到$obj,你可以繼續使用物件的方法!我不建議這樣去做,因為(a)文 檔中沒***這種行為在以後的版本中仍然可以使用。(b) 這個可能導致一種誤解,在你把乙個序列化後的版本儲存到磁碟並退出指令碼時。當以後執行這個指令碼時,你不能期待著在反序列化乙個物件時,物件的方法也會在那 裡,因為字串表示根本就不包括方法。

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

例子:

複製** **如下:

<?php

$obj=new classfoo();

$str=serialize($obj);

//儲存$str到磁碟上

//幾個月以後

//從磁碟中裝入str

$obj2=unserialize($str)

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

有一些辦法可以解決這個問題,我把它留著,因為對這篇簡潔的文章來說,他們太不好。我會很高興地歡迎在php的後續版本中有全序列化的特性。

使用類進行資料儲存php和oop一件非常好的事情就是,你可以很容易地定義乙個類來操作某件事情,並且無論何時你想用的時候都可以呼叫相應的類。 假設你有乙個html表單,使用者可以通過選擇產品id號來選擇乙個產品。在資料庫中有產品的資訊,你想把產品顯示出來,顯示它的**等等。你擁有不同型別 的產品,並且同乙個動作可能對不同程式設計客棧的產品具有不同的意思。例如,顯示乙個聲音可能意味著**它,但是對www.cppcns.com於其它種類的產品可能意味著顯示乙個存在資料庫中的 。你可以使用oop或php來減少編碼並提高質量。

定義乙個產品的類,定義它應該有的方法(例如:顯示),然後定義對每一種型別的產品

的類,從產品類派後出來(sounditem類,viewableitem類,等等),覆蓋在產品類中的方法,使它們按你的想法動作。

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

複製** **如下:

<?php

$obj=new $type();

$obj->action();

這是php的乙個非常好的特性,你可以不用考慮物件的型別,呼叫$obj的顯示方法或其它的方法。使用這個技術,你不需要修改指令碼去增加乙個新型別的物件,只是增加乙個處理它的類。

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

只有高興。

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

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

處理它的類。

可以通過這個技術實現國際化,根據使用者所選的語言字段應用相應的類就可以了,等等。

拷貝和轉殖

當你建立乙個$obj的程式設計客棧物件時,你可以通過$obj2=$obj來拷貝物件,新的對 象是$obj的乙個拷貝(不是乙個引用),所以它具有$obj在當時的狀態。有時候,你不想這樣,你只是想生成乙個象obj類一樣的乙個新的物件,可以通 過使用new語句來呼叫類的建構函式。在php中也可以通過序列化,和乙個基類來實現,但所有的其它類都要從基類派生出來。

進入危險區域

當你序列化乙個物件,你會得到某種格式的字串,如果你感興趣,你可以調究它,其中,字串中有類的名字(太好了!),你可以把它取出來,象:

複製** **如下:

<?php

$herring=serialize($obj);

$vec=explode(':',$herring);

$nam=str_replace("\"",'',$vec[2]);

所以假設你建立了乙個"universe"的類,並且強制所有的類都必須從universe擴充套件,你可以在universe 中定義乙個clone的方法,如下:

複製** **如下:

<?php

function clone()

} //然後

$obj=new something();

//從universe擴充套件

$other=$obj->clone();

你所得到的是乙個新的something類的物件,它同使用new方法,呼叫建構函式建立出的物件一樣。我不知道這個對你是否有用,但是universe類可以知道派生類的名字是乙個好的經驗。想象是唯一的限制。

這個語句就是寫入當azlvk前的時間。

本文標題: php高階oop技術演示

本文位址: /wangluo/php/51009.html

PHP的高階OOP技術

在看過基本的oop概念後,我就可以向你展示更高階的技術 序列化 serializing php不支援永久物件,在oop中永久物件是可以在多個應用的引用中保持狀態和功能的物件,這意味著擁有將物件儲存到乙個檔案或資料庫中的能力,而且可以在以後裝入物件。這就是所謂的序列化機制。php 擁有序列化方法,它可...

PHP的高階OOP技術

php的高階oop技術 在看過基本的oop概念後,我就可以向你展示更高階的技術 序列化 serializing php不支援永久物件,在oop中永久物件是可以在多個應用的引用中保持狀態和功能的物件,這意味著擁 有將物件儲存到乙個檔案或資料庫中的能力,而且可以在以後裝入物件。這就是所謂的序列化機制。p...

高階OOP特性

注意 高階oop特性只在php5及以上版本支援 抽象類 命名空間需要5.3及以上 在php5中,將所有對物件都看作引用,而不是值。那麼如何建立物件的副本呢?答案就是轉殖物件。語法 destinationobject clone targetobject 可以在乙個類裡面定義乙個 clone 方法來調...