首頁 php教程 php手册 第八节--访问方式

第八节--访问方式

Jun 13, 2016 pm 12:37 PM
方式 訪問

/*
+-------------------------------------------------------------------------------+
| = 本文为Haohappy读> 
| = 中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

复制代码 代码如下:

   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
\n");  
   }  
   //FALSE  
   if($w1->equals($w3))  
   {  
       print("w1 and w3 are the same
\n");  
   }  
   //FALSE, == includes id in comparison  
   if($w1 == $w2) //不等,因为ID不同  
   {  
       print("w1 and w2 are the same
\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 

复制代码 代码如下:

   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
\n");  
   }  
   //print Cog 输出 Cog  
   print($w2->getName());  
?> 


一个子类可能改变通过覆写父类方法来改变方法的访问方式,尽管如此,仍然有一些限制. 如果你覆写了一个public类成员,他子类中必须保持public. 如果你覆写了一个protected成员,它可保持protected或变成public.Private成员仍然只在当前类中可见. 声明一个与父类的private成员同名的成员将简单地在当前类中建立一个与原来不同的成员. 因此,在技术上你不能覆写一个private成员. 
Final关键字是限制访问成员方法的另一个方法. 子类不能覆写父类中标识为final的方法. Final关键字不能用于属性.
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱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.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

iOS 17:如何控制哪些應用程式可以存取您的照片 iOS 17:如何控制哪些應用程式可以存取您的照片 Sep 13, 2023 pm 09:09 PM

在iOS17中,Apple可以更好地控制應用程式可以看到的照片內容。繼續閱讀,了解如何按應用程式管理應用程式存取權限。在iOS中,Apple的應用程式內照片選取器可讓您與應用程式分享特定照片,而照片圖庫的其餘部分則保持私密。應用程式必須要求存取您的整個照片圖庫,您可以選擇授予應用程式以下存取權限:受限存取–應用程式只能看到您可以選擇的圖像,您可以隨時在應用程式中或透過前往「設定」&gt ;“隱私和安全性”>“照片”來查看所選圖像。完全存取權限–App可以查看照片

如何在Java中存取JsonNode的JSON欄位、陣列和巢狀物件? 如何在Java中存取JsonNode的JSON欄位、陣列和巢狀物件? Aug 30, 2023 pm 11:05 PM

一個JsonNode是Jackson的JSON樹模型,它可以將JSON讀取為JsonNode實例,並將JsonNode寫入JSON。透過建立ObjectMapper實例並呼叫readValue()方法,我們可以使用Jackson將JSON讀取為JsonNode。我們可以使用JsonNode類別的get()方法來存取欄位、陣列或巢狀物件。我們可以使用asText()方法傳回有效的字串表示,並使用JsonNode類別的asInt()方法將節點的值轉換為Javaint。在下面的範例中,我們可以訪問Json

使用Python存取各種音訊和視訊檔案的元數據 使用Python存取各種音訊和視訊檔案的元數據 Sep 05, 2023 am 11:41 AM

我們可以使用Mutagen和Python中的eyeD3模組存取音訊檔案的元資料。對於視訊元數據,我們可以使用影片和Python中的OpenCV庫。元資料是提供有關其他資料(例如音訊和視訊資料)的資訊的資料。音訊和視訊檔案的元資料包括檔案格式、檔案解析度、檔案大小、持續時間、位元率等。透過存取這些元數據,我們可以更有效地管理媒體並分析元數據以獲得一些有用的信息。在本文中,我們將了解Python提供的一些用於存取音訊和視訊檔案元資料的庫或模組。存取音頻元資料一些用於存取音訊檔案元資料的庫是-使用誘變

解決Tomcat部署war包後無法存取的問題的方法 解決Tomcat部署war包後無法存取的問題的方法 Jan 13, 2024 pm 12:07 PM

如何解決Tomcat部署war包後無法成功存取的困擾,需要具體程式碼範例Tomcat作為一個廣泛使用的JavaWeb伺服器,允許開發人員將自己開發的網路應用程式打包為war檔進行部署。然而,有時我們可能會遇到部署war包後無法成功存取的問題,這可能是由於配置不正確或其他原因引起的。在本文中,我們將提供一些解決這個困擾的具體程式碼範例。一、檢查Tomcat服務

如何解決PHP開發中的外部資源存取和調用 如何解決PHP開發中的外部資源存取和調用 Oct 08, 2023 am 11:01 AM

如何解決PHP開發中的外部資源存取和調用,需要具體程式碼範例在PHP開發中,我們經常會遇到需要存取和調用外部資源的情況,例如API介面、第三方庫或其他伺服器資源。在處理這些外部資源時,我們需要考慮如何進行安全的存取和調用,同時確保效能和可靠性。本文將介紹幾種常見的解決方案,並提供相應的程式碼範例。一、使用curl函式庫進行外部資源呼叫curl是一個非常強大的開源函式庫

win7修改檔案提示變更權限拒絕存取如何解決 win7修改檔案提示變更權限拒絕存取如何解決 Jul 04, 2023 pm 07:01 PM

  win7修改檔案提示變更權限拒絕存取如何解決?有些系統檔案在進行修改的時候,常常會提示我們沒有權限去進行操作。我們可以去進行資料夾權限的功能關閉,或是取得管理員權限。需要修改這類文件的用戶,一起來看看接下來具體的教學分享。 win7修改檔案提示變更權限拒絕存取解決方法  1、先選取對應資料夾,點選上方工具,選取資料夾選項。  2、進入檢視選項卡。  3、取消勾選使用簡單檔案共用然後確定。  4、然後右鍵選擇對應資料夾,點選屬性。  5、進入安全性選項卡。  6、選擇圖示位置,點選進階。  7

win10家庭版共享資料夾無法存取怎麼辦 win10家庭版共享資料夾無法存取怎麼辦 Jan 11, 2024 pm 07:36 PM

在家庭或企業網路環境下,共用資料夾確實是一項極為實用的功能,它能讓您輕鬆地將資料夾分享給其他用戶,以便於檔案的傳輸與分享。 win10家庭版共用資料夾無法存取解決方法:解決方案一:檢查網路連線和使用者權限在嘗試使用Win10共用資料夾時,我們首先需要確認網路連線及使用者權限是否正常。若網路連線故障或使用者未獲得存取共用資料夾的權限,便可能導致無法存取的現象。 1.首先請確保網路連線順暢,以便電腦與共用資料夾所在的電腦在同一區域網路中,能夠正常進行通訊。 2、其次檢查使用者權限,確認目前使用者對於共享文件

Go 語言的時間處理方式有哪些? Go 語言的時間處理方式有哪些? Jun 10, 2023 pm 09:42 PM

Go語言作為一個現代化的程式語言,時間在開發中佔有很重要的地位。 Go語言提供了一些內建的時間函數和結構體,使得時間的處理變得更加便捷。在本篇文章中,將會介紹一些Go語言常用的時間處理方式。 time.Now()我們可以使用time.Now()函數取得目前的時間:now:=time.Now()fmt.Println(now)輸出:2019-06-131

See all articles