php教程 php手册 第九节--绑定 -- Classes and Objects in PHP5 [9]

第九节--绑定 -- Classes and Objects in PHP5 [9]

Jun 13, 2016 am 10:21 AM
and php5 어느 방법 제본 입장 한계

第九节--绑定

除了限制访问,访问方式也决定哪个方法将被子类调用或哪个属性将被子类访问. 函数调用与函数本身的关联,以及成员访问与变量内存地址间的关系,称为绑定.

在计算机语言中有两种主要的绑定方式—静态绑定和动态绑定. 静态绑定发生于数据结构和数据结构间,程序执行之前. 静态绑定发生于编译期, 因此不能利用任何运行期的信息. 它针对函数调用与函数的主体,或变量与内存中的区块. 因为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 动态绑定

<?php 

   class Father 

   { 

       protected $salutation = "Hello there!"; //问候 



       public function getSalutation() 

       { 

           print("$this->salutation
"); 

           $this->identify(); 

       } 



       protected function identify() 

       { 

           print("I am Father.<br>
"); 

       } 

   }; 



   class Son extends Father 

   { 

       protected $salutation = "Hey!";  //父类中的protected $salutation 被覆写 



       protected function identify()    //父类中的protected identify() 被覆写 

       { 

           print("I am Son.<br>
"); 

       } 

   }; 



   $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
<?php 

   class Father 

   { 

       private $salutation = "Hello there!"; 



       public function getSalutation() 

       { 

           print("$this->salutation
"); 

           $this->identify(); 

       } 



       private function identify() 

       { 

           print("I am Father.<br>
"); 

       } 

   } 



   class Son extends Father 

   { 

       private $salutation = "Hey!"; 

       private function identify() 

       { 

           print("I am Son.<br>
"); 

       } 

   } 



   $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 动态绑定的好处
<?php 

   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.<br>
"); 

               return(FALSE); 

           } 



           //delete the user 

           print("User deleted.<br>
"); 

       } 

   } 



   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 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

두 개의 WeChat 계정을 동일한 은행 카드에 연결할 수 있나요? 두 개의 WeChat 계정을 동일한 은행 카드에 연결할 수 있나요? Aug 25, 2023 pm 03:13 PM

두 개의 WeChat 계정을 동일한 은행 카드에 연결할 수 없습니다. WeChat 계정에 은행 카드 연결: 1. WeChat 애플리케이션을 열고 "나" 옵션을 클릭한 다음 "결제" 옵션을 선택합니다. 2. "은행 카드 추가" 옵션을 선택하고 메시지에 따라 은행 카드 정보를 입력합니다. 3. 은행 카드가 성공적으로 연결되면 사용자는 은행 카드를 사용하여 WeChat에서 결제 및 송금을 할 수 있습니다.

php5와 php8의 차이점은 무엇입니까 php5와 php8의 차이점은 무엇입니까 Sep 25, 2023 pm 01:34 PM

php5와 php8의 차이점은 성능, 언어 구조, 유형 시스템, 오류 처리, 비동기 프로그래밍, 표준 라이브러리 기능 및 보안 측면에서 있습니다. 자세한 소개: 1. 성능 향상 PHP5와 비교하여 PHP8은 JIT 컴파일러를 도입하여 일부 고주파 실행 코드를 컴파일하고 최적화하여 실행 속도를 향상시킵니다. PHP8에는 몇 가지 새로운 언어 구조와 기능이 도입되었습니다. PHP8은 명명된 매개변수를 지원하므로 개발자는 매개변수 순서 대신 매개변수 이름을 전달할 수 있습니다.

Vue에서 편집 가능한 테이블을 구현하는 방법 Vue에서 편집 가능한 테이블을 구현하는 방법 Nov 08, 2023 pm 12:51 PM

테이블은 많은 웹 애플리케이션에서 필수적인 구성 요소입니다. 테이블에는 일반적으로 많은 양의 데이터가 있으므로 사용자 경험을 개선하려면 테이블에 몇 가지 특정 기능이 필요합니다. 중요한 기능 중 하나는 편집 가능성입니다. 이 기사에서는 Vue.js를 사용하여 편집 가능한 테이블을 구현하는 방법을 살펴보고 구체적인 코드 예제를 제공합니다. 1단계: 데이터 준비 먼저 테이블에 사용할 데이터를 준비해야 합니다. JSON 객체를 사용하여 테이블의 데이터를 저장하고 Vue 인스턴스의 data 속성에 저장할 수 있습니다. 이 경우

iOS 17: 사진에 액세스할 수 있는 앱을 제어하는 ​​방법 iOS 17: 사진에 액세스할 수 있는 앱을 제어하는 ​​방법 Sep 13, 2023 pm 09:09 PM

iOS17에서 Apple은 앱이 사진에서 볼 수 있는 내용을 더 강력하게 제어할 수 있습니다. 앱별로 앱 액세스를 관리하는 방법을 알아보려면 계속 읽어보세요. iOS에서는 Apple의 앱 내 사진 선택기를 사용하여 특정 사진을 앱과 공유하고 나머지 사진 라이브러리는 비공개로 유지할 수 있습니다. 앱은 전체 사진 라이브러리에 대한 액세스를 요청해야 하며 선택적으로 앱에 다음 액세스 권한을 부여할 수 있습니다. 제한된 액세스 – 앱은 선택할 수 있는 이미지만 볼 수 있으며, 이는 앱에서 언제든지 또는 설정 &gt; 개인 정보 보호 및 보안&gt;사진을 클릭하면 선택한 이미지를 볼 수 있습니다. 전체 액세스 - 앱에서 사진을 볼 수 있음

Java에서 JSONNode의 JSON 필드, 배열 및 중첩 개체에 액세스하는 방법은 무엇입니까? Java에서 JSONNode의 JSON 필드, 배열 및 중첩 개체에 액세스하는 방법은 무엇입니까? Aug 30, 2023 pm 11:05 PM

JsonNode는 JSON을 JsonNode 인스턴스로 읽고 JsonNode를 JSON으로 쓸 수 있는 Jackson의 JSON 트리 모델입니다. Jackson을 사용하면 ObjectMapper 인스턴스를 생성하고 readValue() 메서드를 호출하여 JSON을 JsonNode로 읽을 수 있습니다. JsonNode 클래스의 get() 메서드를 사용하여 필드, 배열 또는 중첩 개체에 액세스할 수 있습니다. asText() 메서드를 사용하여 유효한 문자열 표현을 반환하고 JsonNode 클래스의 asInt() 메서드를 사용하여 노드의 값을 Javaint로 변환할 수 있습니다. 아래 예에서는 Json에 액세스할 수 있습니다.

BTCC 튜토리얼: BTCC 교환에서 MetaMask 지갑을 바인딩하고 사용하는 방법은 무엇입니까? BTCC 튜토리얼: BTCC 교환에서 MetaMask 지갑을 바인딩하고 사용하는 방법은 무엇입니까? Apr 26, 2024 am 09:40 AM

MetaMask(중국어로 Little Fox Wallet이라고도 함)는 무료이며 호평을 받는 암호화 지갑 소프트웨어입니다. 현재 BTCC는 MetaMask 지갑에 대한 바인딩을 지원합니다. 바인딩 후 MetaMask 지갑을 사용하여 빠르게 로그인하고 가치를 저장하고 코인을 구매할 수 있으며 첫 바인딩에는 20 USDT 평가판 보너스도 받을 수 있습니다. BTCCMetaMask 지갑 튜토리얼에서는 MetaMask 등록 및 사용 방법, BTCC에서 Little Fox 지갑을 바인딩하고 사용하는 방법을 자세히 소개합니다. MetaMask 지갑이란 무엇입니까? 3천만 명 이상의 사용자를 보유한 MetaMask Little Fox Wallet은 오늘날 가장 인기 있는 암호화폐 지갑 중 하나입니다. 무료로 사용할 수 있으며 확장으로 네트워크에 설치할 수 있습니다.

Xiaohongshu에서 하위 계정을 연결하는 방법은 무엇입니까? 계정이 정상인지 어떻게 확인하나요? Xiaohongshu에서 하위 계정을 연결하는 방법은 무엇입니까? 계정이 정상인지 어떻게 확인하나요? Mar 21, 2024 pm 10:11 PM

오늘날 정보 폭발 시대에 개인 브랜드와 기업 이미지 구축은 점점 더 중요해지고 있습니다. Xiaohongshu는 중국 최고의 패션 라이프 공유 플랫폼으로서 많은 사용자의 관심과 참여를 이끌어냈습니다. 자신의 영향력을 확대하고 콘텐츠 전파의 효율성을 높이려는 사용자에게 하위 계정 바인딩은 효과적인 수단이 되었습니다. 그렇다면 Xiaohongshu는 어떻게 하위 계정을 연결합니까? 계정이 정상인지 확인하는 방법은 무엇입니까? 이 기사에서는 이러한 질문에 대해 자세히 답변해 드립니다. 1. Xiaohongshu에서 하위 계정을 연결하는 방법은 무엇입니까? 1. 메인 계정에 로그인: 먼저 Xiaohongshu 메인 계정에 로그인해야 합니다. 2. 설정 메뉴를 엽니다. 오른쪽 상단 모서리에 있는 "나"를 클릭한 다음 "설정"을 선택합니다. 3. 계정 관리 입력: 설정 메뉴에서 "계정 관리" 또는 "계정 도우미" 옵션을 찾아 클릭하세요.

비디오 계정에서 댓글 제한을 제거하는 방법은 무엇입니까? 비디오 계정의 댓글 글자수 제한은 어떻게 되나요? 비디오 계정에서 댓글 제한을 제거하는 방법은 무엇입니까? 비디오 계정의 댓글 글자수 제한은 어떻게 되나요? Mar 22, 2024 pm 02:11 PM

소셜 미디어에서 비디오 계정이 인기를 끌면서 점점 더 많은 사람들이 비디오 계정을 사용하여 일상 생활, 통찰력 및 이야기를 공유하기 시작했습니다. 그러나 일부 사용자의 경우 댓글이 제한되어 혼란스럽고 불만족스러울 수 있습니다. 1. 비디오 계정의 댓글 제한을 제거하는 방법은 무엇입니까? 영상 계정의 댓글 제한을 해제하려면 먼저 해당 계정이 제대로 등록되었는지, 실명 인증이 완료되었는지 확인해야 합니다. 영상 계정에는 댓글 제한이 있습니다. 실명 인증을 완료한 계정만 댓글 제한을 해제할 수 있습니다. 계정에 이상이 있는 경우 해당 문제를 해결해야 댓글 제한이 해제됩니다. 2. 영상 계정의 커뮤니티 규정을 준수합니다. 영상 계정에는 댓글 내용에 대한 특정 기준이 있습니다. 댓글에 불법적인 내용이 포함될 경우 발언이 제한됩니다. 댓글 제한을 해제하려면 해당 영상 계정의 커뮤니티를 준수해야 합니다.

See all articles