PHP 5克隆函數(shù)應(yīng)用淺析
毫無疑問,PHP5的推出對網(wǎng)絡(luò)應(yīng)用程序的發(fā)展產(chǎn)生了深遠意義。這還不僅僅是因為它對于PHP4高度的向后兼容性。
當(dāng)然,PHP5數(shù)據(jù)包具備強大的對象模型和一整套新型函數(shù)與庫,更不用說它其中便攜式異常機制,這一機制賦予了它有效處理錯誤和異常事件的能力。 通過PHP在服務(wù)器上寫入文件
當(dāng)然,當(dāng)我們使用“函數(shù)”這一詞時,我們所談?wù)摰牟⒉粌H是通常所指的執(zhí)行指定任務(wù)(如從文件中讀取數(shù)據(jù)或為所供變量應(yīng)用過濾器)的那一概念。我們所指的還包括一些神奇功能(比如PHP 5 的克隆函數(shù)),即那些不具備默認(rèn)的確定執(zhí)行任務(wù)且可以被PHP引擎自動調(diào)用以響應(yīng)某些特定事件的函數(shù)。
開發(fā)對象指向型PHP應(yīng)用程序時,_set(),_get()和_call()方法就種神奇函數(shù)的典型代表,但是還有其他一些神奇函數(shù)值得開發(fā)員深入分析。在本文里,我們將集中討論“_clone()”方法,顧名思義,使用“clone”PHP關(guān)鍵詞時可以從幕后調(diào)用這一方法。
復(fù)制對象的時候從幕后觸發(fā)函數(shù)
就像我們在之前提到的,使用clone關(guān)鍵詞的時候,_clone()函數(shù)(克隆函數(shù))會被自動援引。為了簡潔起見,現(xiàn)在我們只談?wù)撚脕韯?chuàng)建指定對象單獨副本的clone關(guān)鍵詞,而不談及創(chuàng)建引用。 用PHP把HTML添加到多個文件中
現(xiàn)在,返回_clone函數(shù),可以給它一個明確的任務(wù)指示。為了實現(xiàn)這一點,我們看看下面的代碼:
- class User
- {
- // constructor (not implemented)
- public function _construct(){}
- // set undeclared property in a restrictive way
- public function __set($property, $value)
- {
- if (in_array($property, array('fname', 'lname', 'email')) === TRUE)
- {
- $this->$property = $value;
- }
- }
- // get undeclared property
- public function __get($property)
- {
- if (isset($this->$property))
- {
- return $this->$property;
- }
- }
- // single point to fetch user data
- public function __call($method, $args)
- {
- if ($method === 'fetch' AND emptyempty($args) === FALSE)
- {
- return $this->$args[0];
- }
- }
- // implement __clone( method
- public function __clone()
- {
- echo 'Cloning user object.';
- }
- }
在這個特定示例中,我們要給上述的_clone方法一個不太顯眼的任務(wù),以便幫助你更好地理解,但是要相信該函數(shù)可以用來執(zhí)行更為復(fù)雜的任務(wù)。不管本文中所演示的_clone函數(shù)是如何簡單,復(fù)制簡單的User類實例時,該函數(shù)非常有助于向我們展示PHP引擎是怎樣調(diào)用函數(shù)的。
復(fù)制對象的時候調(diào)用Clone方法
要明白PHP解釋程序是如何調(diào)用_clone()函數(shù)最好的方法是觀察一個演示如何復(fù)制簡單User類實例的具體示例。
我們制作了一個小型腳本,該腳本使用克隆函數(shù)中的clone關(guān)鍵字來復(fù)制一個用戶對象從而觸發(fā)有關(guān)_clone()方法的調(diào)用。該腳本的定義如下所示:
- $user = new User();
- $user->fname = 'Alejandro';
- $user->lname = 'Gervasio';
- $user->email = 'alejandro@mydomain.com';
- // display user data
- echo 'First Name : ' . $user->fetch('fname') . ' Last Name : ' . $user->fetch('lname') .
' Email : ' . $user->fetch('email');- /*
- displays the following
- First Name : Alejandro Last Name : Gervasio Email : alejandro@mydomain.com
- */
- // clone user object
- $newuser = clone $user;
- /*
- displays the following
- Cloning user object.
- */
這段代碼易于編寫,也易于理解。正如你所看到的,一旦腳本在User類中生成一個對象并創(chuàng)建一些未申明的屬性,它就會復(fù)制這個對象。這個進程會自動調(diào)用相關(guān)的_clone()方法。
這一具體方法支持更復(fù)雜更有益的任務(wù)執(zhí)行。因此,如果PHP5中附帶的這些神奇函數(shù)已經(jīng)引起你的注意,你或許想通過使用這些函數(shù)改善自己的編程技能了。這樣的嘗試將極具啟發(fā)性。
結(jié)語
本文中,我們討論了如何實施和使用_clone()函數(shù)。對象通過clone關(guān)鍵詞復(fù)制時,該函數(shù)會被自動引用;這就是PHP 5克隆函數(shù)的強大之處。
【編輯推薦】