天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

第八節--訪問方式

/*
+-------------------------------------------------------------------------------+
| = 本文為Haohappy讀<<Core php Programming>> 
| = 中Classes and Objects一章的筆記 
| = 翻譯為主+個人心得 
| = 為避免可能發生的不必要的麻煩請勿轉載,謝謝 
| = 歡迎批評指正,希望和所有php愛好者共同進步! 
| = php5研究中心: http://blog.csdn.NET/haohappy2004
+-------------------------------------------------------------------------------+
*/
第八節--訪問方式
php5的訪問方式允許限制對類成員的訪問. 這是在php5中新增的功能,但在許多面向對象語言中都早已存在. 有了訪問方式,才能開發一個可靠的面向對象應用程序,并且構建可重用的面向對象類庫.
像C++和Java一樣,php有三種訪問方式:public,private和protected. 對于一個類成員的訪問方式,可以是其中之一. 如果你沒有指明訪問方式,默認地訪問方式為public. 你也可以為靜態成員指明一種訪問方式,將訪問方式放在static關鍵字之前(如public static).
Public成員可以被毫無限制地訪問.類外部的任何代碼都可以讀寫public屬性. 你可以從腳本的任何地方調用一個public方法. 在php的前幾個版本中,所有方法和屬性都是public, 這讓人覺得對象就像是結構精巧的數組.
Private(私有)成員只在類的內部可見. 你不能在一個private屬性所在的類方法之外改變或讀取它的值. 同樣地,只有在同一個類中的方法可以調用一個private方法. 繼承的子類也不能訪問父類中的private 成員.
要注意,類中的任何成員和類的實例都可以訪問private成員. 看例子6.8,equals方法將兩個widget進行比較.==運算符比較同一個類的兩個對象,但這個例子中每個對象實例都有唯一的ID.equals方法只比較name和price. 注意equals方法如何訪問另一個Widget實例的private屬性. Java和C都允許這樣的操作.
Listing 6.8 Private members
復制代碼 代碼如下:<?php  
   class Widget  
   {  
       private $name;  
       private $price;  
       private $id;  
       public function __construct($name, $price)  
       {  
           $this->name = $name;  
           $this->price = floatval($price);  
           $this->id = uniqid();  
       }  
       //checks if two widgets are the same 檢查兩個widget是否相同  
       public function equals($widget)  
       {  
           return(($this->name == $widget->name)AND  
               ($this->price == $widget->price));  
       }  
   }  
   $w1 = new Widget('Cog', 5.00);  
   $w2 = new Widget('Cog', 5.00);  
   $w3 = new Widget('Gear', 7.00);  
   //TRUE  
   if($w1->equals($w2))  
   {  
       print("w1 and w2 are the same<br>/n");  
   }  
   //FALSE  
   if($w1->equals($w3))  
   {  
       print("w1 and w3 are the same<br>/n");  
   }  
   //FALSE, == includes id in comparison  
   if($w1 == $w2) //不等,因為ID不同  
   {  
       print("w1 and w2 are the same<br>/n");  
   }  
?>  如果你對面向對象編程不熟悉,你可能想知道用private成員的目的是什么. 你可以回憶一下封裝和耦合的想法,這在本章開頭我們有討論過. Private成員有助于封裝數據. 他們可以隱藏在一個類內部而不被類外部的代碼接觸到. 同時他們還有助于實現松散的耦合. 如果數據結構外的代碼不能直接訪問內部屬性,那么就不會產生一個隱性的關聯性.
當然,大部分private屬性仍然可以被外部代碼共享. 解決方法是用一對public方法,一個是get(獲取屬性的值),另一個是set(設置屬性的值). 構造函數也接受屬性的初始值. 這使得成員間的交流通過一個狹窄的,經過良好限定的接口來進行. 這也提供改變傳遞給方法的值的機會. 注意在例子6.8中,構造函數如何強制使price成為一個float數(floadval()).
Protected(受保護的) 成員能被同個類中的所有方法和繼承出的類的中所有方法訪問到. Public屬性有違封裝的精神,因為它們允許子類依賴于一個特定的屬性來書寫.protected方法則不會帶來這方面的擔憂.一個使用protected方法的子類需要很清楚它的父類的結構才行.
例子6.9由例子6.8改進而得到,包含了一個Widget的子類Thing. 注意Widget現在有一個叫作getName的protected方法. 如果Widget的實例試圖調用protected方法將會出錯: $w1->getName()產生了一個錯誤. 但子類Thing中的getName方法可以調用這個protected方法.當然對于證明Widget::getName方法是protected,這個例子顯得過于簡單. 在實際情況下,使用protected方法要依賴于對對象的內部結構的理解.
Listing 6.9 Protected members 
復制代碼 代碼如下:<?php  
   class Widget  
   {  
       private $name;  
       private $price;  
       private $id;  
       public function __construct($name, $price)  
       {  
           $this->name = $name;  
           $this->price = floatval($price);  
           $this->id = uniqid();  
       }  
       //checks if two widgets are the same  
       public function equals($widget)  
       {  
           return(($this->name == $widget->name)AND  
               ($this->price == $widget->price));  
       }  
       protected function getName()  
       {  
           return($this->name);  
       }  
   }  
   class Thing extends Widget  
   {  
       private $color;  
       public function setColor($color)  
       {  
           $this->color = $color;  
       }  
       public function getColor()  
       {  
           return($this->color);  
       }  
       public function getName()  
       {  
           return(parent::getName());  
       }  
   }  
   $w1 = new Widget('Cog', 5.00);  
   $w2 = new Thing('Cog', 5.00);  
   $w2->setColor('Yellow');  
   //TRUE (still!) 結果仍然為真  
   if($w1->equals($w2))  
   {  
       print("w1 and w2 are the same<br>/n");  
   }  
   //print Cog 輸出 Cog  
   print($w2->getName());  
?> 
一個子類可能改變通過覆寫父類方法來改變方法的訪問方式,盡管如此,仍然有一些限制. 如果你覆寫了一個public類成員,他子類中必須保持public. 如果你覆寫了一個protected成員,它可保持protected或變成public.Private成員仍然只在當前類中可見. 聲明一個與父類的private成員同名的成員將簡單地在當前類中建立一個與原來不同的成員. 因此,在技術上你不能覆寫一個private成員. 
Final關鍵字是限制訪問成員方法的另一個方法. 子類不能覆寫父類中標識為final的方法. Final關鍵字不能用于屬性.

php技術第八節--訪問方式,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产精品爆乳尤物99精品 | 亚洲 综合 自拍 精品 在线 | 国产精品久久久久婷婷五月色 | 伊人影院2019 | 在线视频 亚洲 | 我在厨房摸岳的乳HD在线观看 | 国产人成高清在线视频99 | 亚洲中文字幕在线精品 | 国产在线高清视频无码不卡 | 久久综合狠狠综合久久综合88 | 97精品国产亚洲AV高清 | 国产成人免费在线观看 | 日本 稀土矿 | 小柔的性放荡羞辱日记 | 久久这里只精品热在线99 | 韩国伦理片2018在线播放免费观看 | 亚洲视频91 | 一个人的HD高清在线观看 | 男人女人边摸边吃奶边做 | 午夜福利在线观看6080 | 99热久久这里只有精品 | aaaaaa级特色特黄的毛片 | 色欲AV人妻精品麻豆AV | 久见久热 这里只有精品 | 日韩视频在线观看 | 免费在线视频一区 | 亚洲精品成人在线 | 免费国产综合视频在线看 | 成人小视频在线观看免费 | 韩国电影real在线观看完整版 | 99福利影院| 国产亚洲精品久久久久久久 | 国产成人午夜精品免费视频 | 大香伊人久久精品一区二区 | 欧美麻豆一精品一AV一免费 | 一区视频免费观看 | 香蕉人人超人人超碰超国产 | 十分钟免费观看高清视频大全 | 国产人成无码视频在线观看 | 国产午夜精品视频在线播放 | 久久精品免费看网站 |