PHP 대상 프로 그래 밍 에 대한 깊이 있 는 이해 방법 리 셋 및 방법 덮어 쓰기(다 중)

무엇이 다 형 입 니까?
다 형(Polymorphism)은 글자 그대로'다양한 상태'라 는 뜻 이다.대상 언어 에서 인터페이스의 다양한 실현 방식 은 다 형 이다.Charlie Calverts 가 다 중 에 대한 설명 을 참조 합 니 다.다 형 성 은 아버지 대상 을 하나 이상 의 아들 대상 과 같은 기술 로 설정 할 수 있 도록 하 는 것 입 니 다.값 을 부여 한 후에 아버지 대상 은 현재 부 여 된 하위 대상 의 특성 에 따라 서로 다른 방식 으로 작 동 할 수 있 습 니 다("Delphi 4 프로 그래 밍 기술 내막"참조).쉽게 말 하면 하위 클래스 의 지침 을 부모 클래스 의 지침 에 할당 할 수 있 습 니 다.그렇다면 다 형 적 역할 은 무엇 일 까?그것 은 어떤 실제 개발 가치 가 있 을 까?실제 응용 개발 에서 대상 을 대상 으로 하 는 다 형 태 는 주로 서로 다른 하위 대상 을 하나의 부모 로 처리 할 수 있 고 서로 다른 하위 대상 간 에 존재 하 는 차 이 를 차단 하고 통용 되 는 코드 를 써 서 통용 되 는 프로 그래 밍 을 하여 수요 의 변화 에 적응 할 수 있다.
다음은 PHP 의 다 중 구현 두 가지 입 니 다. 
방법 과부하(overload)
무 거 운 짐 은 클래스 의 다 태 적 인 실현 이다.함수 리 로드 란 하나의 식별 자 를 여러 함수 명 으로 사용 하고 함수 의 매개 변수 개수 나 매개 변수 유형 을 통 해 같은 이름 의 함 수 를 구분 하여 호출 할 수 있 으 며 헷 갈 리 지 않 습 니 다.즉,호출 할 때 방법 이름 은 같 지만 매개 변수 에 따라 해당 함 수 를 자동 으로 호출 할 수 있 습 니 다.

class A{
  public function test(){
    echo "test1";
  }
  public function test($a){
    echo "test2";
  }
}
$a=new A();
$a->test();
$a->test($a); 
php 가 직접 재 부팅 방법 을 지원 한다 면.그러면 위의 예 를 실행 한 후 전 삼 과 불 전 삼 은 서로 다른 값 을 되 돌려 줍 니 다.그러나 php 는 재 부팅 을 직접 지원 하지 않 습 니 다.이것 은 위 에서 정 의 를 직접 누 르 면 잘못 보고 한 다 는 것 을 의미 합 니 다.무슨 잘못 을 갚 을 까?다음 과 같은 잘못 을 보고 하 겠 습 니 다.
 
이 뜻 은 A 함 수 를 중복 정의 할 수 없다 는 것 이다.잘못된 줄 수도 바로 아래 줄 이다.

public function test($a){ 
그 러 니까 phop 은 무 거 운 짐 을 직접 지원 하지 않 습 니 다.이렇게 한참 동안 함께 말 했 지만 php 는 결코 지지 하지 않 는 다.서 두 르 지 마 세 요.제 가 말 한 것 은 직접적 으로 지지 하지 않 는 다 는 것 입 니 다.그래서 우 리 는 phop 을 간접 적 으로 지지 할 수 있 습 니 다.이 럴 때 는 재 부팅 을 지원 하 는 함수 가 필요 합 니 다.바로call()。__call()방법 은 두 개의 인 자 를 가 져 야 합 니 다.첫 번 째 는 호출 된 방법 이름 을 포함 하고 두 번 째 매개 변 수 는 이 방법 에 전 달 된 매개 변수 배열 을 포함한다.이 방법 을 통 해 함수 과부하 와 유사 한 기능 을 실현 할 수 있다.아래 코드 보 세 요.

public function __call($method,$p)
{
  if($method=="display"){
    if(is_object($p[0])){
      $this->displayObject($p[0]);
    }else if(is_array($p[0])){
      $this->displayArray($p[0]);
    }else{
      $this->displayScalar($p[0]);
    }
  }
}
//           
$ov=new overload;
$ov->display(array(1,2,3));
$ov->display('cat'); 
방법 을 정의 할 때 세 가지 가 있 습 니 다.한 대상 이 display()방법 에 전달 되면 display Object()방법 을 호출 합 니 다.하나의 배열 을 전달 하면 displayArray()를 호출 합 니 다.다른 내용 을 전달 하면 displayScalar()방법 을 호출 합 니 다.아래 호출 을 볼 수 있 을 때 첫 번 째 는 배열 을 전달 하고 displayArray()를 호출 합 니 다.두 번 째 로 들 어 오 는 것 은 대상 도 배열 도 아 닌 다른 내용 에 속 하 며 display Scalar()방법 을 호출 합 니 다.그래서 이렇게call()방법 은 다른 언어 와 유사 한 방법 으로 다시 불 러 옵 니 다.
방법 덮어 쓰기(override)
덮어 쓰 는 것 은 본질 적 으로 다시 쓰 는 것 이다.바로 하위 클래스 가 부모 클래스 를 계승 하 는 몇 가지 방법 을 사용 한 후에 하위 클래스 는 그 내부 에서 같은 방법 을 정의 했다.그러면 이 새로운 정의 방법 은 계 승 된 부모 클래스 를 덮어 쓰 고 하위 클래스 는 그 내부 정의 방법 만 사용 할 수 있다.
다음 과 같은 몇 가지 요구 가 있다.
1.부모 클래스 와 하위 클래스 가 하나의 방법 이 있 고 매개 변수 와 이름 이 완전히 일치 하면 하위 클래스 방법 은 부모 클래스 를 덮어 쓰 는 방법 입 니 다.
2.방법 을 덮어 쓸 때 액세서리 에 접근 하 는 것 은 다 를 수 있 지만 하위 클래스 의 접근 범 위 는 부모 클래스 와 같은 접근 범위 보다 커 야 합 니 다.
3.인자 와 이름 이 같 아야 합 니 다.자식 을 구 하 는 것 이 아니 라 부모 의 이름 이 같다.
다음은 이 몇 가지 점 에 대한 설명 이다.
첫 번 째,매개 변수 가 일치 해 야 방법 을 덮어 쓸 수 있 습 니 다.매개 변수 개수 가 일치 하지 않 으 면 오류 가 발생 합 니 다.방법 이름 이 일치 하지 않 으 면 덮어 쓰 지 않 고 하위 클래스 의 새로운 정의 방법 일 뿐 입 니 다.
두 번 째 는 php 라 는 언어 디자인 의 규정 이 죠.저 는 이렇게 이해 합 니 다.높 은 층 에 있 는 것 을 방문 하 는 것 이 비교적 쉬 워 서 밑바닥 에 있 는 것 을 다시 방문 하면 권한 이 좀 높 을 것 입 니 다.
코드 보기:

class people{
  protected function sing(){
    echo "   ";
  }
} 
class woman extends people{
  public function sing(){
    echo "    ";
  }
}
$woman1=new woman();
$woman1->sing(); 
이렇게 하면 정상적으로'여자 노래'를 출력 할 수 있다.그러나 woman 의 sing()방법 을 proctcted 로 바 꾸 고 부모 요 소 를 Public()로 바 꾸 면 부모 클래스 의 접근 권한 이 하위 클래스 보다 크 면 다음 과 같은 오 류 를 보고 합 니 다.
 
 세 번 째 는 매개 변수 와 이름 이 같 아야 한 다 는 것 입 니 다.구체 적 으로 매개 변수의 개 수 는 부모 와 같 아야 합 니 다.매개 변수 이름 이 일치 하 는 것 이 아 닙 니 다.즉,전달 하 는 매개 변수 이름 은 임 의적 으로 전달 하 는 개수 가 같 으 면 된다.
이상 의 내용 은 PHP 언어 에서 다 태 적 인 두 가지 실현 을 간단하게 소개 했다.
PS:재 작성,덮어 쓰기,재 업로드,다 중 몇 가지 개념의 차이 분석
override->다시 쓰기(=덮어 쓰기),과부하->다시 불 러 오기,polymorphism->다 중
override 는 서로 다른 기능 을 실현 하기 위해 재 작성(덮어 쓰기)하 는 방법 입 니 다.일반적으로 하위 클래스 가 부 류 를 계승 할 때 부 류 를 다시 쓰 는 방법 이다.
덮어 쓰기(덮어 쓰기)규칙:
   1.재 작성 방법의 매개 변수 목록 은 재 작성 방법 과 똑 같 아야 합 니 다.그렇지 않 으 면 재 작성 이 아니 라 재 업로드 라 고 할 수 없습니다.
   2.재 작성 방법의 방문 수식 자 는 재 작성 방법의 방문 수식 자(public>protected>default>private)보다 커 야 합 니 다.
   3.다시 쓰 는 방법의 반환 값 은 다시 쓰 는 방법의 반환 과 일치 해 야 합 니 다.
   4.재 작성 방법 에 의 해 던 진 이상 은 재 작성 방법 에 의 해 던 진 이상 과 일치 하거나 하위 클래스 와 일치 해 야 합 니 다.
   5.재 작성 하 는 방법 은 private 가 될 수 없습니다.그렇지 않 으 면 하위 클래스 에서 하나의 방법 만 정 의 했 을 뿐 재 작성 하지 않 았 습 니 다.
   6.정적 방법 은 비 정적 방법 으로 다시 쓸 수 없습니다(컴 파일 오류 가 발생 할 수 있 습 니 다).
overload 는 과부하 입 니 다.보통 한 클래스 에서 몇 개의 과부하 방법 을 실현 하 는 데 사 용 됩 니 다.이 방법 들 은 이름 이 같 고 매개 변수 형식 이 다 릅 니 다.
다시 불 러 오 는 규칙:
   1.리 셋 을 사용 할 때 같은 방법 명,서로 다른 매개 변수 형식 으로 만 이 루어 집 니 다.서로 다른 매개 변수 유형 은 서로 다른 매개 변수 유형,서로 다른 매개 변수 개수,서로 다른 매개 변수 순서(매개 변수 유형 은 반드시 같 지 않 아야 함)일 수 있 습 니 다.
   2.접근 권한,반환 형식,던 진 이상 을 통 해 다시 불 러 올 수 없습니다.
   3.방법의 이상 유형 과 수량 은 과부하 에 영향 을 주지 않 습 니 다.
다 형 적 개념 은 비교적 복잡 하고 여러 가지 의미 가 있 는 다 형 이다.재 미 있 지만 엄밀 하지 않 은 설 은 계승 은 자 류 가 부 류 를 사용 하 는 방법 이 고 다 형 은 부 류 가 자 류 를 사용 하 는 방법 이다.
일반적으로 우리 가 다 중 태 도 를 사용 하 는 것 은 부모 류 에서 코드 가 비대 하고 유지 하기 어 려 운 것 을 피하 기 위해 서 이다.
예 를 들 어:

public class Shape 
{
  public static void main(String[] args){
   Triangle tri = new Triangle();
   System.out.println("Triangle is a type of shape? " + tri.isShape());//   
   Shape shape = new Triangle();
   System.out.println("My shape has " + shape.getSides() + " sides."); //   
   Rectangle Rec = new Rectangle();
   Shape shape2 = Rec;
   System.out.println("My shape has " + shape2.getSides(Rec) + " sides."); //  
  }
  public boolean isShape(){
   return true;
  }
  public int getSides(){
   return 0 ;
  }
  public int getSides(Triangle tri){ //  
   return 3 ;
  }
  public int getSides(Rectangle rec){ //  
  return 4 ;
  }
}
class Triangle extends Shape 
{
  public int getSides() { //  ,    
   return 3;
  }
}
class Rectangle extends Shape 
{
  public int getSides(int i) { //  
  return i;
  }
}
트라이앵글 류 를 주의 하 는 방법 은 재 작성 이 고 Rectangle 류 는 재 업로드 입 니 다.두 가 지 를 비교 하면 다 중 부하 에 대한 장점 을 발견 할 수 있다.
무 거 운 짐 을 사용 하면 부모 클래스 에서 모든 하위 클래스 에 변 수 를 얻 는 방법 을 다시 불 러 와 야 합 니 다.
다 중 태 를 사용 하면 부 류 는 변 수 를 얻 는 인터페이스 만 제공 하고 어떤 모양 의 변 수 를 얻 는 지,어떻게 얻 는 지,하위 클래스 에서 각각 실현(재 작성)합 니 다.

좋은 웹페이지 즐겨찾기