首頁 php教程 php手册 第九节--绑定

第九节--绑定

Jun 13, 2016 pm 12:36 PM
綁定

*
+-------------------------------------------------------------------------------+
| = 本文为Haohappy读> 
| = 中Classes and Objects一章的笔记 
| = 翻译为主+个人心得 
| = 为避免可能发生的不必要的麻烦请勿转载,谢谢 
| = 欢迎批评指正,希望和所有PHP爱好者共同进步! 
| = PHP5研究中心: http://blog.csdn.net/haohappy2004
+-------------------------------------------------------------------------------+
*/
第九节--绑定
除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问. 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定. 
在计算机语言中有两种主要的绑定方式—静态绑定和动态绑定. 静态绑定发生于数据结构和数据结构间,程序执行之前. 静态绑定发生于编译期, 因此不能利用任何运行期的信息. 它针对函数调用与函数的主体,或变量与内存中的区块. 因为PHP是一种动态语言,它不使用静态绑定. 但是可以模拟静态绑定.
动态绑定则针对运行期产生的访问请求,只用到运行期的可用信息. 在面向对象的代码中,动态绑定意味着决定哪个方法被调用或哪个属性被访问,将基于这个类本身而不基于访问范围.
Public和protected成员的动作类似于PHP的前几个版本中函数的动作,使用动态绑定. 这意味着如果一个方法访问一个在子类中被覆写的类成员,并是一个子类的实例,子类的成员将被访问(而不是访问父类中的成员).
看例子6.10. 这段代码输出” Hey! I am Son.” 因为当PHP调用getSalutation, 是一个Son的实例,是将Father中的salutation覆写而来. 如果salutation是public的,PHP将产生相同的结果. 覆写方法的操作很类似.在Son中,对于identify的调用绑定到那个方法.
即使在子类中访问方式被从protected削弱成public, 动态绑定仍然会发生. 按照访问方式使用的原则,增强对于类成员的访问限制是不可能的. 所以把访问方式从public改变成protected不可能进行.
Listing 6.10 Dynamic binding 动态绑定

复制代码 代码如下:

   class Father  
   {  
       protected $salutation = "Hello there!"; //问候  
       public function getSalutation()  
       {  
           print("$this->salutation\n");  
           $this->identify();  
       }  
       protected function identify()  
       {  
           print("I am Father.
\n");  
       }  
   };  
   class Son extends Father  
   {  
       protected $salutation = "Hey!";  //父类中的protected $salutation 被覆写  
       protected function identify()    //父类中的protected identify() 被覆写  
       {  
           print("I am Son.
\n");  
       }  
   };  
   $obj = new Son();  
   $obj->getSalutation();  //输出Hey! I am Son.  
?>  

//注: 在子类中没有覆写getSalutation(),但实际上仍然存在一个getSalutation().这个类中的$salutation和identify()
//与Son子类的实例中的getSalutation()方法动态绑定,所以调用Son的实例的getSalutation()方法,
//将调用Son类中的成员salutation及identify(),而不是父类中的成员salutation及identify().
Private成员只存在于它们所在的类内部. 不像public和protected成员那样,PHP模拟静态绑定. 看例子6.11. 它输出”Hello there! I am Father.”,尽管子类覆写了salutation的值. 脚本将this->salutation和当前类Father绑定. 类似的原则应用于private方法identify().
Listing 6.11 Binding and private members

复制代码 代码如下:

   class Father  
   {  
       private $salutation = "Hello there!";  
       public function getSalutation()  
       {  
           print("$this->salutation\n");  
           $this->identify();  
       }  
       private function identify()  
       {  
           print("I am Father.
\n");  
       }  
   }  
   class Son extends Father  
   {  
       private $salutation = "Hey!";  
       private function identify()  
       {  
           print("I am Son.
\n");  
       }  
   }  
   $obj = new Son();  
   $obj->getSalutation(); //输出Hello there! I am Father.  
?> 

动态绑定的好处是允许继承类来改变父类的行为,同时可以保持父类的接口和功能. 看例子6.12. 由于使用了动态绑定,在deleteUser中被调用的isAuthorized的version 可以由对象的类型来确定. 如果是一个普通的user,PHP调用User::isAuthorized会返回FALSE.如果是一个AuthorizedUser的实例,PHP调用AuthorizedUser::isAuthorized,将允许deleteUser顺利执行.
//haohappy注:用一句话说清楚,就是对象类型与方法,属性绑定. 调用一个父类与子类中都存在的方法或访问一个属性时,会先判断实例属于哪种对象类型,再调用相应的类中的方法和属性.
Listing 6.12 动态绑定的好处 

复制代码 代码如下:

   class User //用户  
   {  
       protected function isAuthorized()  //是否是验证用户  
       {  
           return(FALSE);  
       }  
       public function getName()  //获得名字  
       {  
           return($this->name);  
       }  
       public function deleteUser($username) //删除用户  
       {  
           if(!$this->isAuthorized())  
           {  
               print("You are not authorized.
\n");  
               return(FALSE);  
           }  
           //delete the user  
           print("User deleted.
\n");  
       }  
   }  
   class AuthorizedUser extends User //认证用户  
   {  
       protected function isAuthorized() //覆写isAuthorized()  
       {  
           return(TRUE);  
       }  
   }  
   $user = new User;  
   $admin = new AuthorizedUser;  
   //not authorized  
   $user->deleteUser("Zeev");  
   //authorized  
   $admin->deleteUser("Zeev");  
?>  

为什么private的类成员模拟静态绑定? 为了回答这个问题, 你需要回忆一下为什么需要有private成员.什么时候用它们来代替protected成员是有意义的?
private成员只有当你不想让子类继承改变或特殊化父类的行为时才用到. 这种情况比你想像的要少. 通常来说,一个好的对象分层结构应当允许绝大多数功能被子类特殊化,改进,或改变—这是面向对象编程的基础之一. 一定的情况下需要private方法或变量,例如当你确信你不想允许子类改变父类中的某个特定的部份. 
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

兩張微信可以綁定同一張銀行卡嗎 兩張微信可以綁定同一張銀行卡嗎 Aug 25, 2023 pm 03:13 PM

兩個微信不可以綁定同一張銀行卡。綁定銀行卡到微信帳戶操作:1、打開微信應用程序,點擊“我”選項,然後選擇“支付”選項;2、選擇“添加銀行卡”選項,並按照系統提示輸入銀行卡信息;3、一旦銀行卡綁定成功,用戶就可以在微信中使用該銀行卡進行付款和轉帳。

如何在Vue中實作可編輯的表格 如何在Vue中實作可編輯的表格 Nov 08, 2023 pm 12:51 PM

在許多Web應用程式中,表格是必不可少的一個元件。表格通常具有大量數據,因此表格需要一些特定的功能來提高使用者體驗。其中一個重要的功能是可編輯性。在本文中,我們將探討如何使用Vue.js實作可編輯的表格,並提供具體的程式碼範例。步驟1:準備資料首先,我們需要為表格準備資料。我們可以使用JSON物件來儲存表格的數據,並將其儲存在Vue實例的data屬性中。在本例中

BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? BTCC教學:如何在BTCC交易所綁定使用MetaMask錢包? Apr 26, 2024 am 09:40 AM

MetaMask(中文也叫小狐狸錢包)是一款免費的、廣受好評的加密錢包軟體。目前,BTCC已支援綁定MetaMask錢包,綁定後可使用MetaMask錢包進行快速登錄,儲值、買幣等,且首次綁定還可獲得20USDT體驗金。在BTCCMetaMask錢包教學中,我們將詳細介紹如何註冊和使用MetaMask,以及如何在BTCC綁定並使用小狐狸錢包。 MetaMask錢包是什麼? MetaMask小狐狸錢包擁有超過3,000萬用戶,是當今最受歡迎的加密貨幣錢包之一。它可免費使用,可作為擴充功能安裝在網絡

小紅書怎麼綁定子帳號?它怎麼檢測帳號是否正常? 小紅書怎麼綁定子帳號?它怎麼檢測帳號是否正常? Mar 21, 2024 pm 10:11 PM

在現今這個資訊爆炸的時代,個人品牌和企業形象的建立變得越來越重要。小紅書作為國內領先的時尚生活分享平台,吸引了大量用戶關注和參與。對於那些希望擴大影響力、提高內容傳播效率的使用者來說,綁定子帳號成為了一種有效的手段。那麼,小紅書怎麼綁定子帳號呢?又如何檢測帳號是否正常呢?本文將為您詳細解答這些問題。一、小紅書怎麼綁定子帳號? 1.登入主帳號:首先,您需要登入您的小紅書主帳號。 2.開啟設定選單:點選右上角的“我”,然後選擇“設定”。 3.進入帳號管理:在設定選單中,找到「帳號管理」或「帳號助理」選項,點

今日頭條綁定抖音的步驟方法 今日頭條綁定抖音的步驟方法 Mar 22, 2024 pm 05:56 PM

1、打開今日頭條。 2、點選右下角我的。 3.點選【系統設定】。 4.點選【帳號和隱私設定】。 5.點選【抖音】右邊的按鈕即可綁定抖音。

菜鳥app怎麼綁定拼多多 菜鳥裹裹怎麼添加拼多多平台 菜鳥app怎麼綁定拼多多 菜鳥裹裹怎麼添加拼多多平台 Mar 19, 2024 pm 02:30 PM

菜鳥app就是能夠提供你們各種物流資訊狀況的平台,這裡的功能非常的強大好用,大家有任何與物流相關的問題,都能在這得到解決的,反正都能為你們帶來一站式的服務,全都能及時解決的,查快遞,取快遞,寄快遞等,都是毫無任何問題,與各個的平台都進行了合作,全部的信息,都能查詢得到的,但是有些時候會出現拼多多當中購買的商品,都是無法呈現出物流的信息,其實是需要大家進行手動綁定拼多多,才能實現的,具體的方法已經整理出來了在下方,大家都能來看看的。菜鳥綁定拼多多帳戶的方法:  1、打開菜鳥APP,在主頁面

菜鳥APP怎麼綁定拼多多 菜鳥APP綁定拼多多方法 菜鳥APP怎麼綁定拼多多 菜鳥APP綁定拼多多方法 Mar 19, 2024 pm 05:16 PM

你們知道在使用菜鳥裹裹的時候是怎麼來綁定拼多多的嗎?菜鳥裹裹App官方正版在這款平台上面對於一些拼多多的物流信息是沒有自動同步上去的,我們需要做的就只能複製單號過來或是查詢你們的手機看看有無快遞的資訊。當然這些都是需要手動完成的,如果你們也想了解更多的話,就和小編一起來看看吧。  菜鳥APP怎麼綁定拼多多  1、打開菜鳥APP,在主頁點選左上角的「導包裹」。  2、在介面中,有許多購物網站,帳號都可以綁定。  3、點選導入其他電商平台。  4、使用者授權:點選拼多多到介面

小米汽車app怎麼綁定充電樁設備 小米汽車app怎麼綁定充電樁設備 Apr 01, 2024 pm 06:52 PM

最新小米最新推出的小米su7型號汽車霸佔了各種熱搜榜,許多正好有購車需求的用戶們都紛紛選擇了小米su7型號的汽車進行購買,那麼在提車以後如何利用自己的小米汽車app綁定家用充電樁充電呢,那麼這篇教學攻略就會為大家帶來詳細的內容介紹,希望能幫助大家。首先我們先打開小米手機app,點擊右下角我的按鈕然後在我的介面,可以看到家充樁的選項進入到綁定充電樁的頁面以後,點擊下方的去掃碼按鈕,掃描充電樁上的二維碼即可完成充電樁與app的綁定

See all articles