제9 절 귀속[9]

접근 제한 을 제외 하고 접근 방식 도 이불 류 를 호출 하거나 어떤 속성 으로 이불 류 를 방문 할 지 결정 합 니 다.함수 호출 은 함수 자체 와 관련 되 고 구성원 의 방문 과 변수 메모리 주소 간 의 관 계 를 바 인 딩 이 라 고 합 니 다.컴퓨터 언어 에서 두 가지 주요 한 묶 기 방식 인 정적 바 인 딩 과 동적 바 인 딩 이 있 습 니 다.정적 바 인 딩 은 데이터 구조 와 데이터 구조 간 에 발생 합 니 다.프로그램 이 실행 되 기 전에 정적 바 인 딩 은 컴 파일 기간 에 발생 하기 때문에 어떠한 런 타임 정보 도 사용 할 수 없습니다.함수 호출 과 함수 의 주체 또는 변수 와 메모리 에 있 는 블록 을 대상 으로 합 니 다.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 Dynamic binding 동적 바 인 딩
salutationn");$this->identify(); } protected function identify() { print("I am Father.
n"); } }; class Son extends Father { protected $salutation = "Hey!"; file://부모 클래스 의 proctected$salutation 덮어 쓰기 proctected function identify()file://부모 클래스 의 proctected 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 에 적 용 됩 니 다.
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 동적 바 인 딩 의 장점
name);}public function deleteUser($username)file://사용자{if(!$this->isAuthorized()) { print("You are not authorized.
n"); return(FALSE); } //delete the user print("User deleted.
n"); } } class AuthorizedUser extends User file:/인증 사용자{protected function isAuthorized()file://덮어 쓰기 isAuthorized(){return(TRUE);}}$user = new User; $admin = new AuthorizedUser; //not authorized $user->deleteUser("Zeev"); //authorized $admin->deleteUser("Zeev"); ?> 왜 private 클래스 구성원 들 은 정적 바 인 딩 을 모 의 합 니까?이 질문 에 대답 하기 위해 서 는 왜 private 멤버 가 필요 한 지 기억 해 야 합 니 다.언제 protected 멤버 대신 사용 하 는 것 이 의미 가 있 습 니까?private 구성원 은 하위 클래스 의 계승 을 바 꾸 거나 부모 클래스 의 행 위 를 특수 화 시 키 고 싶 지 않 을 때 만 사용 합 니 다.이런 상황 은 생각 보다 적 습 니 다.일반적으로 좋 은 대상 의 계층 구 조 는 절대 다수의 기능 이불 류 의 특수 화,개선 또는 변 화 를 허용 해 야 합 니 다.이것 은 대상 을 대상 으로 프로 그래 밍 하 는 기초 중 하나 입 니 다.일정한 상황 에서 private 방법 이나 변수 가 필요 합 니 다.예 를 들 어 하위 클래스 가 부모 클래스 의 특정한 부분 을 바 꾸 는 것 을 허락 하고 싶 지 않다 고 확신 할 때.

좋은 웹페이지 즐겨찾기