PHP 5.0 개체 모델 깊이 탐색 의 귀속

4594 단어 PHHPP5500 대대상
접근 제한 을 제외 하고 접근 방식 도 이불 류 를 호출 하거나 어떤 속성 으로 이불 류 를 접근 할 지 결정 합 니 다.함수 호출 은 함수 자체 와 관련 되 고 구성원 접근 과 변수 메모리 주소 간 의 관 계 를 바 인 딩 이 라 고 합 니 다.
컴퓨터 언어 에는 두 가지 주요 한 귀속 방식 인 정적 귀속 과 동적 귀속 이 있다.정적 바 인 딩 은 데이터 구조 와 데이터 구조 간 에 발생 합 니 다.프로그램 이 실행 되 기 전에 정적 바 인 딩 은 컴 파일 기간 에 발생 하기 때문에 어떠한 운행 기간 의 정 보 를 이용 할 수 없습니다.함수 호출 과 함수 의 주체 나 변수 와 메모리 의 블록 을 대상 으로 합 니 다.PHP 는 동적 언어 이기 때문에 정적 바 인 딩 을 사용 하지 않 습 니 다.하지만 정적 바 인 딩 을 모 의 할 수 있 습 니 다.
동적 바 인 딩 은 런 타임 에 대한 접근 요청 으로 런 타임 에 만 사용 할 수 있 는 정보 입 니 다.대상 을 대상 으로 하 는 코드 에서 동적 바 인 딩 은 어떤 방법 이 호출 되 거나 어떤 속성 이 접근 되 는 지 결정 하 는 것 을 의미 하 며,이러한 종류의 자체 에 기반 을 두 고 접근 범 위 를 기반 으로 하지 않 습 니 다.
Public 와 proctected 멤버 의 동작 은 PHP 의 이전 버 전의 함수 동작 과 유사 하 며 동적 바 인 딩 을 사용 합 니 다.하위 클래스 에 복 사 된 클래스 구성원 을 방문 하고 하위 클래스 의 인 스 턴 스 를 방문 하면 하위 클래스 의 구성원 이 부모 클래스 에 접근 하 는 것 이 아 닙 니 다.
예 를 들 어 6.10.이 코드 출력"Hey!"I am Son."PHP 가 getSalutation 을 호출 할 때 Son 의 인 스 턴 스 이 며,Father 의 salutation 을 덮어 쓰 는 것 이기 때 문 입 니 다.salutation 이 Public 이 라면 PHP 는 같은 결 과 를 얻 을 것 입 니 다.덮어 쓰 는 방법 은 매우 유사 합 니 다.Son 에서 identify 호출 을 그 방법 으로 연결 합 니 다.
하위 클래스 에서 접근 방식 이 proctected 에서 Public 로 약화 되 더 라 도 동적 바 인 딩 은 발생 합 니 다.방문 방식 에 따라 사용 하 는 원칙 에 따라 클래스 구성원 에 대한 접근 제한 을 강화 하 는 것 은 불가능 하기 때문에 방문 방식 을 Public 에서 proctected 로 바 꾸 는 것 은 불가능 합 니 다.
Listing 6.10 동적 바 인 딩 동적 바 인 딩
class Father { protected $salutation = "Hello there!"; //안 부 를 묻다
public function getSalutation() { print("$this->salutationn"); $this->identify(); }
protected function identify() { print("I am Father.n"); } };
class Son extends Father { protected $salutation = "Hey!"; //부모 클래스 의 proctected$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 와 proctected 멤버 처럼 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->salutationn"); $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 로 돌아 갑 니 다.Authorized User 의 인 스 턴 스 라면 PHP 호출 Authorized User::isAuthorized 는 deleteUser 가 순조롭게 실행 할 수 있 도록 합 니 다.
//haohhappy 주:한 마디 로 대상 유형 과 방법,속성 바 인 딩 입 니 다.부모 클래스 와 하위 클래스 에 존재 하 는 방법 을 호출 하거나 속성 을 방문 할 때 인 스 턴 스 가 어떤 대상 유형 에 속 하 는 지 판단 한 다음 에 해당 하 는 클래스 의 방법 과 속성 을 호출 합 니 다.
Listing 6.12 동적 귀속 의 장점
class User//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 방법 이나 변수 가 필요 합 니 다.예 를 들 어 하위 클래스 가 부모 클래스 의 특정한 부분 을 바 꾸 는 것 을 허락 하지 않 는 다 고 확신 할 때.

좋은 웹페이지 즐겨찾기