精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

探秘PHP 5的對象重載技術

開發 后端 前端
PHP 4中已經有了重載的語法來建立對于外部對象模型的映射,就像Java那樣。PHP 5帶來了強大的面向對象重載,允許程序員建立自定義的行為來訪問屬性和調用方法。

PHP 5中引入了對象重載技術,本文將探討對于方法__call(),__set()以及__get()進行重載的可能性。在對重載理論作簡單介紹后,我們將通過兩個例子直奔主題:***例,實現持續存儲類;第二例,找到一種實現動態的getter/setter的方法。

關于PHP更多內容,51CTO推薦專題:PHP開發基礎入門

一、什么是對象重載?

在PHP中談到對象重載時,我們要區別兩種類型:

◆方法重載

◆屬性重載

在方法重載的情況下,我們要定義一個魔術般的方法__call(),它將實現一個在相應類中對未定義方法的籠統調用。只有當你想存取類中未定義的方法時,這種籠統方法才會被調用。在沒有方法重載的情況下,下面的例子將導致PHP顯示一條致命錯誤信息:Call to undefined method ThisWillFail::bar() in/some/directory/example.php on line 9并流產程序的執行:

  1. <?php  
  2.  class ThisWillFail {  
  3. public function foo() {  
  4.  return "Hello World!";  
  5. }  
  6.  }  
  7.  $class = new ThisWillFail;  
  8.  $class->bar();  
  9. ?>  

借助方法重載的幫助,代碼能夠捕獲到這種調用且能夠體面地給以處理。屬性重載與方法重載差不多。這種情況下,類把讀/寫操作重定向(亦可稱代理)到類的屬性,這些屬性在類中沒有顯式定義。這里的專門方法是__set()和__get()。依賴于錯誤報告等級,PHP翻譯器通常在存取一個未定義的屬性時,或者發出一個通知,或者推遲一下并潛在地定義這個變量。

而如果使用屬性重載,翻譯器卻可以在設置一個未定義的屬性時調用__set(),而在存取一個未定義的屬性值時調用__get()。綜上所述,利用重載技術可以實現在象用PHP這樣的動態語言進行時軟件開發時間的大大縮短。

二、持續性存儲類舉例

下列代碼,通過使用屬性重載技術,用少于50行的PHP代碼實現了上面所提到的持續性存儲類。術語persistable意味著類可以從一個數據結構中描述一個元素,并保持與底端存儲系統的同步。用編碼的解釋就是,外部代碼可以使用類來實現從一個數據庫表中選定一行。

這樣,在程序運行時,可以直接存取類的屬性來操縱該行中的元素(讀/取)。在腳本結束時,PHP將負責把更新的行數據回送到數據庫中去。精心研讀下面代碼將有助于你理解什么是屬性重載。

  1. <?php  
  2.  //裝入PEAR的 <a href="http://pear.php.net/package/DB/">DB package</a>  
  3.  require_once "DB.php";  
  4.  class Persistable {  
  5. private $data = array();  
  6. private $table = "users";  
  7. public function __construct($user) {  
  8.  $this->dbh = DB::Connect("mysql://user:password@localhost/database");  
  9.  $query = "SELECT id, name, email, country FROM " .  
  10.  $this->table . " WHERE name = ?";  
  11.  $this->data = $this->dbh->getRow($query, array($user),  
  12.  DB_FETCHMODE_ASSOC);  
  13. }  
  14. public function __get($member) {  
  15.  if (isset($this->data[$member])) {  
  16. return $this->data[$member];  
  17.  }  
  18. }  
  19.  
  20. public function __set($member, $value) {  
  21.  // dataset的ID是只讀的  
  22.  if ($member == "id") {  
  23. return;  
  24.  }  
  25.  if (isset($this->data[$member])) {  
  26. $this->data[$member] = $value;  
  27.  }  
  28. }  
  29. public function __destruct() {  
  30.  $query = "UPDATE " . $this->table . " SET name = ?,   
  31.  email = ?, country = ? WHERE id = ?";  
  32.  $this->dbh->query($query, $this->name, $this->email,   
  33.  $this->country, $this->id);  
  34. }  
  35.  }  
  36.  $class = new Persistable("Martin Jansen");  
  37.  $class->name = "John Doe";  
  38.  $class->country = "United States";  
  39.  $class->email = "john@example.com";  
  40. ?>  

#p#

你遇到的***個問題可能是__construct(),這是PHP 5中引入的新的構造器方法。在PHP 4時代,構造器總是與它們的類名相匹配。在PHP 5中已不再是這樣。你不需要對構造器方法有過多的了解,除了調用它可以創建一個類的實例外;并注意到,這里使用了一個參數 - 執行一個基于此參數的數據庫。此構造器把查詢結果賦值給類屬性$data。

接下來,程序定義了兩個特別的方法__get()和__set()。你應該對它們早已熟悉:__get()用于讀取未定義的屬性值,__set()用于修改未定義的屬性值。

這意味著無論什么時候從持續性存儲類中讀取/寫入一個未定義的屬性,由這些專門方法來負責管理在屬性數組變量$data中的信息,而不是直接改變類的屬性(切記:變量$data包含著來自于數據庫中的一行!)。

類中的***一個方法是__construct()的對立者- 析構器__destruct()。PHP在"腳本關閉階段"調用析構器,典型地這是在PHP腳本執行快要結束的時候。析構器把來自于$data屬性的信息寫回到數據庫中去。這正是前面同步(synchronization )術語的含義。

你可能早已注意到,這里的代碼使用了PEAR的數據庫抽象層包(database abstraction layer package)。其實這無所謂,通過別的方式與數據庫通訊也一樣能說明本文的主題。

如果你細心觀察,會發現該持續性存儲類的描述比較簡單。例子中僅涉及了一個數據庫表,而沒有考慮更復雜的數據模型,如使用LEFT JOIN和其它復雜的數據庫操作技術。然而你不必受此約束,借助于屬性重載,你可以使用你自己理想的數據庫模型。只需要加入少許代碼,你即可以在該持續性存儲類中運用復雜的數據庫特性。

還存在一個小問題 - 當在析構器中查詢失敗時并沒有引入錯誤處理機制。是析構器的天性導致在這種情況下不可能顯示相應的錯誤信息,因為構建HTML標志常常在PHP調用構析器之前就已經結束了。

為解決這個問題,你可以把__destruct()重命名為象saveData()這樣的名字并在調用腳本的某處手工執行這一方法。這對于類的持續性存儲的概念并沒有任何改變;僅是多寫幾行代碼而已。作為選擇,你還可以在析構器中使用函數error_log()來記錄下屬于系統范圍的錯誤記錄文件中的錯誤信息。屬性重載的工作機制就是這樣。下面我們討論一下方法重載。

 三、方法重載舉例

1. 動態的Getter/Setter方法

下列代碼實現了"動態"getter/setter方法以借助于方法重載的幫助來控制類。下面我們結合源代碼進行分析:

  1. <?php  
  2.  class DynamicGetterSetter {  
  3. private $name = "Martin Jansen";  
  4. private $starbucksdrink = "Caramel Cappuccino Swirl";  
  5. func  
  1. tion __call($method, $arguments) {  
  2.  $prefix = strtolower(substr($method, 0, 3));  
  3.  $property = strtolower(substr($method, 3));  
  4.  if (empty($prefix) || empty($property)) {  
  5. return;  
  6.  }  
  7.  if ($prefix == "get" && isset($this->$property)) {  
  8. return $this->$property;  
  9.  }  
  10.  if ($prefix == "set") {  
  11. $this->$property = $arguments[0];  
  12.  }  
  13. }  
  14.  }  
  15.  $class = new DynamicGetterSetter;  
  16.  echo "Name: " . $class->getName() . "\n";  
  17.  echo "Favourite Starbucks flavour: " . $class->getStarbucksDrink() . "\n\n";  
  18.  $class->setName("John Doe");  
  19.  $class->setStarbucksDrink("Classic Coffee");  
  20.  echo "Name: " . $class->getName() . "\n";  
  21.  echo "Favourite Starbucks flavour: " . $class->getStarbucksDrink() . "\n\n";  
  22. ?>  

很明顯,這里的兩個屬性$name和$starbucksdrink都是私有的,就是說從類的外部是不能夠存取這些屬性的。在面向對象的編程中,實現公共的getter/setter方法來存取或修改非公共屬性的值是很經常的事情。實現這些是單調的事情,且相當耗費時間和精力。

借助于方法重載可以容易得解決這個問題。不是為每個屬性實現getter/setter方法,上面只實現了一個通用的__call()方法。這意味著當調用一個未定義的getter/setter方法如setName()或者getStarbucksdrink()時,PHP不會產生一個致命錯誤而流產,而是執行(或者代理到)魔術般的__call()方法。這是些簡單介紹,下面我們對__call()作一下深入分析。

2. 詳細分析__call()方法

__call()的***個參數是原始的且尚未確定的方法(如setName),第二個參數是一個數字索引的一維數組,它包含了原始方法的所有參數。用兩個參數("Martin"和42)調用一個未定義的方法將產生下面數組:

  1. $class->thisMethodDoesNotExist("Martin", 42);  
  2. /導向__call()的第二個參數  
  3. Array  
  4. (  
  5. [0] => Martin  
  6. [1] => 42  
  7. )  

在方法__call()內部,如果原始方法以get或者set開頭,則要進行某種計算以確定是否代碼調用的是一個getter/setter方法。而且,這種方法還要進一步分析方法名的另外一組成部分(除去開始的三個字符),因為后面這部分字符串正代表getter/setter參照的屬性的名字。

如果方法名中指示有一個getter/setter,那么該方法或者返回相應的屬性值,或者設置原始方法的***個參數的值。如果沒有的話,它不做任何事情,繼續執行程序,好象沒有事情發生。

3. 實現目標

實質上,相應于任意的屬性,存在一種方法允許代碼動態地調用任意的getter/setter方法,這種算法是存在的。這在短期內開發一個程序原型的情況下是很方便的:不是花費大量時間來實現getters/setters,開發人員可以專注于建模API并保證應用程序的根本正確。把__call()方法納入到一個抽象類中甚至有可能使你在將來的PHP工程開發中實現代碼的重用!

4. 不足之外

有優點就有缺點。以上方法也有幾個不足:較大些的項目可以會使用象phpDocumentor這樣的工具來跟蹤API結構。用上面介紹的動態方法,所有的getter/setter方法當然不會出現在自動生成的文檔中,這是無需多作解釋的。

另外一個不足是,類外面的代碼可以存取類內的每一個私有屬性。當使用真正的getter/setter方法時,有可能區別開外部代碼可以存取的私有屬性和對類外部不可見的"真正的"私有屬性 - 因為我們有方法重載,而且有虛擬的getter和setter方法可以利用。

結論

本文通過兩個例子細致分析了PHP 5中對象重載的兩種情形。很希望本文的方法幫助你提高PHP編程的工作效率!同時,你也應清醒地看到這種方法的不足。

【編輯推薦】

  1. 重載和類的自動加載
  2. PHP面向對象編程的基礎知識講解
  3. PHP 5 數據對象 (PDO) 抽象層與 Oracle 
責任編輯:王曉東 來源: 天極網
相關推薦

2010-07-19 08:41:56

Facebook

2010-03-10 10:03:10

Python對象體系

2009-11-23 19:50:12

PHP6.0

2010-11-12 09:04:03

TwitterAPI

2024-01-26 16:37:47

C++運算符開發

2016-11-15 07:56:13

雙十一云計算科技新聞早報

2009-06-10 09:21:45

Google Wave架構

2014-11-27 09:31:26

2019-06-04 09:26:35

UCloudUDB數據庫

2009-12-22 17:00:58

ADOMD.NET對象

2025-07-04 07:26:58

HotSpot虛擬機對象

2022-06-24 09:36:47

Python對象調用

2014-08-21 10:17:45

WLAN

2017-10-19 12:45:07

PHP

2009-11-23 13:44:33

PHP5面向對象

2009-11-25 17:05:56

PHP5對象simpl

2024-07-26 10:23:52

2023-09-13 08:33:17

2023-12-07 08:07:47

Node流程代碼

2012-06-20 13:48:53

黑客
點贊
收藏

51CTO技術棧公眾號

妓院一钑片免看黄大片| 精品乱码一区二区三区| 久久国产高清视频| 亚洲国产欧美在线观看| 亚洲成人在线观看视频| 日本黄网免费一区二区精品| 亚洲最大成人在线视频| 精品电影一区| 国产亚洲精品日韩| 日韩久久久久久久久久久| 1024在线看片你懂得| 国产欧美日韩综合| 高清视频一区二区三区| 樱花视频在线免费观看| 欧美二区视频| 国产亚洲精品久久久| 2025中文字幕| 91成人在线| 亚洲一区二区av电影| 日韩欧美亚洲日产国| 国内老熟妇对白xxxxhd| 日韩高清国产一区在线| 色综合久久悠悠| 99久久久无码国产精品衣服| 日本成人手机在线| 欧美日韩亚洲国产综合| 玩弄中年熟妇正在播放| 成人免费在线| 中文字幕欧美国产| 国产一区二区不卡视频在线观看 | 精品国产福利视频| 国产又大又长又粗又黄| 国产女人在线观看| 99在线视频精品| 99电影网电视剧在线观看| 中文字幕+乱码+中文字幕明步| 在线日韩av| 久久国产天堂福利天堂| 91导航在线观看| 亚洲另类av| 欧美精品一区二区三区在线播放| 中文字幕第17页| 刘亦菲一区二区三区免费看| 亚洲国产精品久久人人爱蜜臀| 一区二区在线不卡| www.亚洲免费| 国产日韩欧美综合一区| 国产伦精品一区二区三区四区视频 | 91wwwcom在线观看| 国产在线拍揄自揄拍| 中文一区一区三区免费在线观看| 久久精品电影网站| 2014亚洲天堂| 国产高清欧美| 欧美成人一区二区三区电影| 欧美爱爱免费视频| 亚洲精品国产偷自在线观看| 久久精品人人做人人爽| 26uuu成人网| 欧美欧美天天天天操| 欧美精品亚州精品| 91视频免费在线看| 国色天香一区二区| 国语自产偷拍精品视频偷| 国产污视频在线看| 亚洲综合日韩| 国产精品美乳一区二区免费| 在线免费av网| 国产精品影音先锋| 国产精品一区视频网站| 偷拍精品一区二区三区| 久久日一线二线三线suv| 欧美污视频久久久| 午夜免费视频在线国产| 《视频一区视频二区| 嫩草影院中文字幕| 鲁鲁在线中文| 色av成人天堂桃色av| www.com黄色片| 玖玖精品一区| 日韩成人中文字幕| 精品国产aaa| 外国成人免费视频| 午夜免费久久久久| 69av视频在线观看| 国产一区91精品张津瑜| 国产精品一区二区三区不卡 | 区一区二在线观看| 久久成人久久爱| 国产不卡一区二区三区在线观看| 天堂在线视频网站| 国产精品欧美极品| 乱人伦xxxx国语对白| 日韩一区中文| 亚洲精品ady| 天堂av网手机版| 亚洲特色特黄| 国产精品久久久久久一区二区 | 无码人妻精品一区二区三区99v| 丝袜综合欧美| 色综合天天综合网国产成人综合天| 久久99999| 奇米影视777在线欧美电影观看| 在线观看国产成人av片| 青青草免费av| 日韩av一区二区在线影视| 99热99热| 欧美日韩在线看片| 岛国av一区二区三区| 91热视频在线观看| 自拍视频一区| 久久久久久这里只有精品| 午夜一区二区三区四区| 成人黄色网址在线观看| 资源网第一页久久久| 成人爽a毛片免费啪啪| 日韩欧美一区二区免费| 男女男精品视频网站| 国产欧美精品久久| 动漫一区二区在线| 你懂的在线播放| 亚洲成av人片一区二区梦乃| 在线视频观看91| 成人激情诱惑| 日韩av不卡电影| 农村少妇久久久久久久| 亚洲三级久久久| 一区二区xxx| 你懂的视频欧美| 91成人在线播放| 人妻视频一区二区三区| 亚洲精品视频一区| 日本一二区免费| 狠狠色狠狠色综合婷婷tag| 欧美有码在线观看视频| 六月婷婷中文字幕| 亚洲一区二区三区三| 能看毛片的网站| 最新国产精品| 91热精品视频| 成人ww免费完整版在线观看| 欧美揉bbbbb揉bbbbb| 成都免费高清电影| 久久精品五月| 欧美日韩精品免费观看| 欧美日韩国产观看视频| 亚洲国产一区二区三区四区| 国产大片aaa| 波多野结衣在线aⅴ中文字幕不卡| 日本aa在线观看| 国产欧美三级电影| 性色av一区二区三区| 黄色三级网站在线观看| 午夜视频在线观看一区| 中文字幕精品视频在线| 亚洲精品123区| 精品日本一区二区| 精品国产免费人成网站| 亚洲欧美另类国产| 最新黄色网址在线观看| 国产精品视频在线看| 污片在线免费看| 99久久婷婷这里只有精品| 91精品视频专区| av网站在线免费| 精品国产乱码91久久久久久网站| 国产一级一片免费播放| aaa国产一区| 苍井空浴缸大战猛男120分钟| 欧洲杯半决赛直播| 国产日产欧美精品| 四虎影院观看视频在线观看 | 亚洲一区二区在线播放| 在线heyzo| 日韩精品久久久久| 伊人免费在线观看| 依依成人精品视频| 三级男人添奶爽爽爽视频| 性高湖久久久久久久久| 亚洲乱码一区二区三区| 欧美视频精品全部免费观看| 97激碰免费视频| 北条麻妃在线| 日韩欧美成人一区| 久久亚洲精品石原莉奈 | 亚洲欧美日韩网| 亚洲香蕉在线视频| 亚洲国产精品久久一线不卡| 国产美女免费网站| 国产成人午夜视频| 37pao成人国产永久免费视频| 97精品国产福利一区二区三区| 超碰97国产在线| av一区在线播放| 九九热精品视频| 国产中文在线视频| 日韩欧美高清在线| 午夜精品一区二| 伊人开心综合网| 国产一区二区三区精品在线| 国产成人aaa| 日本中文字幕高清| 亚洲国产免费| 国产卡一卡二在线| 亚洲国产国产| 国产66精品久久久久999小说| 日韩精品第一| 97视频在线看| 91小视频xxxx网站在线| 亚洲午夜激情免费视频| 亚洲精品免费在线观看视频| 欧美影院精品一区| 色播视频在线播放| 亚洲精品一二三| 自拍偷拍第9页| 久久久亚洲午夜电影| 国内精品免费视频| 国产精品一区二区久激情瑜伽 | 精品成人久久久| 亚洲欧美日本在线| 黄色裸体一级片| 久久久精品免费免费| www.男人天堂| 国产91综合一区在线观看| 91 在线视频观看| 青青草国产精品亚洲专区无| www.com毛片| 亚洲毛片视频| 日韩精品在线视频免费观看| 91精品啪在线观看国产81旧版 | 视频一区二区三区不卡| 亚洲欧美综合另类中字| 手机看片福利在线| 精品欧美久久久| www黄色网址| 91精品国产欧美日韩| 一级淫片免费看| 欧美美女喷水视频| 一区二区 亚洲| 欧美日韩国产美| 国产毛片毛片毛片毛片毛片| 欧美日韩在线电影| 亚洲视频在线免费播放| 精品视频一区三区九区| 中文字幕在线观看精品| 欧美撒尿777hd撒尿| 中国一级片黄色一级片黄| 91国产成人在线| 自拍偷拍色综合| 欧美日韩精品一区二区在线播放| 中文字幕视频二区| 欧美性生活大片视频| 伊人精品在线视频| 亚洲精品动漫| 欧美一卡二卡在线| 伊人成人在线观看| 91精品国产色综合久久| 国产欧美综合视频| 欧美mv日韩mv| 少妇av一区二区| 亚洲人a成www在线影院| 成人午夜影视| 北条麻妃久久精品| a在线免费观看| 欧美激情在线观看| 牛牛精品一区二区| 国产精品久久久久不卡| 香蕉久久一区| 国产精品嫩草在线观看| 色婷婷狠狠五月综合天色拍| 日本在线一区| 婷婷精品进入| www.日本在线播放| 日韩高清电影一区| 国产chinesehd精品露脸| 99久久伊人久久99| 欧美福利在线视频| 一区二区免费视频| 中文字幕第四页| 欧美美女一区二区| 天堂在线中文网| 日韩在线免费视频观看| 免费在线看电影| 国产成人综合精品| aa亚洲一区一区三区| 好吊色欧美一区二区三区 | 国产成人激情av| 丰腴饱满的极品熟妇| 亚洲人成精品久久久久久| 黄色一级片免费看| 欧美日本一道本在线视频| 日本xxxx人| 日韩中文字幕视频在线| а√在线中文在线新版| 国产精品久久久亚洲| 日韩一区二区三区高清在线观看| 蜜桃成人在线| 欧美韩国一区| 高清一区在线观看| 成人av在线影院| 你懂得在线观看| 日韩欧美黄色动漫| www.久久成人| 日韩在线视频国产| 中文字幕21页在线看| 亚洲在线视频观看| 成人羞羞视频播放网站| av7777777| 国产成人在线影院| 国产三级黄色片| 五月天一区二区三区| 99精品久久久久久中文字幕| 亚洲欧美综合另类中字| 超碰资源在线| 97se亚洲综合| 欧美韩日高清| 黄色国产小视频| 久久综合久久综合久久| 精品国产一区二区三区久久久狼| 国产黄在线看| 91av在线视频观看| 国产+成+人+亚洲欧洲在线| 91xxx视频| 美女性感视频久久| 一级肉体全黄裸片| 色嗨嗨av一区二区三区| 亚洲人成色777777精品音频| 欧美激情一区二区三区高清视频| 亚洲日本中文| 综合国产精品久久久| 日本亚洲最大的色成网站www| 久久久无码人妻精品一区| 亚洲国产wwwccc36天堂| 二区三区在线视频| 欧美精品情趣视频| 一区二区三区在线免费看| 永久免费网站视频在线观看| 国产一区二区在线免费观看| 久草福利资源在线| 欧美日韩国产首页在线观看| 嫩草在线视频| 成人精品一区二区三区电影黑人| 成人免费在线播放| xx欧美撒尿嘘撒尿xx| 国产精品网友自拍| 中文字幕日本人妻久久久免费| 亚洲视频在线观看| av成人免费| 视频一区二区视频| 韩国理伦片一区二区三区在线播放| 欧美日韩色视频| 欧美一级片在线看| 色www永久免费视频首页在线| av一本久道久久波多野结衣| 欧美精品午夜| 成人在线视频免费播放| 欧美日韩美女在线| 男人av在线| 国产精品久久久久久久久久三级| 日韩欧美中字| 亚洲制服在线观看| 亚洲五码中文字幕| 手机福利在线| 国产精品女人久久久久久| 欧美成人激情| 中文字幕在线观看91| 午夜影院久久久| 高清国产福利在线观看| 成人国产在线视频| 国产精品草草| 熟女俱乐部一区二区| 欧美系列亚洲系列| caopon在线免费视频| 久久久精品国产一区二区三区| 久久亚洲色图| 日韩欧美综合视频| 日韩成人av一区| 久久91视频| 精品一区二区三区无码视频| 91免费版在线| 91好色先生tv| 午夜伦理精品一区| 欧美在线观看视频一区| 动漫av在线免费观看| 狠狠干狠狠久久| 嫩草香蕉在线91一二三区| 国产精品一区在线观看| 男人的天堂亚洲一区| 国产香蕉在线视频| 中文字幕欧美精品在线| 91亚洲精品视频在线观看| 无码人妻丰满熟妇区毛片18| 日韩美女视频一区二区| 青青草手机在线| 亚洲v日本v欧美v久久精品| 国产精品无码无卡无需播放器| 日韩欧美一区在线观看| 日本高清不卡一区二区三区视频 | 黄色影院在线看| 亚洲激情一区二区|