> 백엔드 개발 > PHP 튜토리얼 > PHP의 객체지향 다형성 예제에 대한 자세한 설명

PHP의 객체지향 다형성 예제에 대한 자세한 설명

小云云
풀어 주다: 2023-03-21 16:34:01
원래의
1268명이 탐색했습니다.

이 기사에서는 주로 PHP의 객체 지향 다형성 예제에 대한 자세한 설명을 공유합니다. 다형성은 PHP가 수행하는 클래스 사용 상황에 따라 클래스의 특성과 동작을 재정의하거나 변경하는 기능을 의미합니다. 다형성을 달성하기 위한 오버로딩을 지원하지 않지만 PHP는 다양한 방향으로 다형성 효과를 달성할 수 있습니다.

는 다음과 같습니다.

class a{    function test($i){ // $i可以是任何类型的变量
        print_r $i;
    }
}
로그인 후 복사

위의 예에서 PHP는 약한 유형의 언어이므로 $i는 모든 유형의 변수가 될 수 있음을 알 수 있습니다. 이러한 방식으로 함수는 매개변수 유형을 변경하여 오버로딩 방법을 구현할 수 있습니다. Java와 같은 강력한 유형의 언어로.

이 형식은 JAVA의 매개변수 유형 오버로딩보다 더 편리하고 효율적이지만 다음과 같은 문제도 있습니다.

<?php/**
教师类有一个drawPolygon()方法需要一个Polygon类,用来画多边形,此方法内部调用多边形的draw()方法,但由于弱类型,我们可以传入Circle类,就会调用Circle类的draw方法,这就事与愿违了。甚至可以传入阿猫、阿狗类,如果这些类没有draw()方法还会报错。*/class Teacher{    function drawPolygon($polygon){ 
        $polygon->draw(); 
    }    
}class Polygon{    function draw(){        echo "draw a polygon";
    }
}class Circle{    function draw(){        echo "draw a circle";
    }
}?>
로그인 후 복사

이러한 유연한 다형성에는 약간의 제어가 필요함을 알 수 있습니다. PHP5.3 이후에는 유형 제한이 적용될 수 있습니다.

// 仿java,在变量参数前加一个限制类名
    function drawPolygon(Polygon $polygon){ 
        $polygon->draw(); 
    }
로그인 후 복사

이는 Polygon 및 해당 하위 클래스만 전달되도록 제한합니다.

매개변수 수를 변경하는 오버로드도 있습니다. 이는 PHP가 메서드 오버로딩을 지원하지 않기 때문에 이를 구현하려면 다음과 같은 몇 가지 대체 메서드가 필요합니다.

<?php// 通过可变参数来达到改变参数数量重载的目的
// 不是必须传入的参数,必须在函数定义时赋初始值function open_database($DB, $cache_size_or_values=null, $cache_size=null)
{    switch (function_num_args())  
// 通过function_num_args()函数计算传入参数的个数,根据个数来判断接下来的操作   
 {        case 1:            
 $r = select_db($DB);           
  break;        case 2:           
   $r = select_db($DB, $cache_size_or_values);           
    break;        case 3:           
     $r = select_db($DB, $cache_size_or_values, $cache_size);            
     break;
    }    return is_resource($r);
}?>
로그인 후 복사

관련 권장 사항:

PHP 객체 지향 상속 , 다형성과 캡슐화 소개

PHP 다형성과 동적 바인딩

객체 지향 다형성 방법을 구현한 PHP 사례

위 내용은 PHP의 객체지향 다형성 예제에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿