"오버로딩"은 클래스의 다형성 구현입니다. 함수 오버로딩(Function Overloading)은 하나의 식별자를 여러 개의 함수 이름으로 사용하는 것을 의미하며, 동일한 이름을 가진 이러한 함수는 함수 매개변수의 개수나 매개변수 유형으로 구분할 수 있어 호출 시 혼동이 발생하지 않습니다. 이것의 가장 큰 장점은 다양한 매개변수 유형이나 매개변수 수에 대해 여러 함수를 작성할 필요가 없다는 것입니다. 여러 함수가 동일한 이름을 사용하지만 매개변수 목록, 즉 매개변수의 개수 또는 (및)
데이터 유형이 다를 수 있습니다. 호출 시 메서드 이름은 동일하더라도 해당 함수가 자동으로 생성될 수 있습니다. 매개변수 목록에 따라 호출됩니다. PHP4는
객체 지향
의 간단한 기능 중 일부만 구현하지만 PHP5는 훨씬 더 강력하게 객체를 지원합니다. 다형성 구현의 경우 PHP4는 재정의만 지원하고 오버로드는 지원하지 않습니다. 그러나 우리는 오버로딩 구현을 "시뮬레이트"하기 위해 몇 가지 트릭을 사용할 수 있습니다.
PHP5는 덮어쓰기와 오버로딩을 지원할 수 있지만, 오버로딩의 구체적인 구현은 여전히 다른 언어와 상당히 다릅니다.
1, PHP4의 "시뮬레이트" 오버로딩
다음 코드를 시도해 보세요:
<?php //根据参数个数选择执行不同的方法(在 PHP4 中模拟"重载"(多态的一种) class Myclass { function Myclass() { $method = "method" . func_num_args(); $this->$method(); } function method1($x) { echo "method1"; } function method2($x, $y) { echo 'method2'; } } //通过在类中的额外的处理,使用这个类对用户是透明的: $obj1 = new Myclass('A'); //将调用 method1 $obj2 = new Myclass('B','C'); //将调用 method2 ?>
의 func_num_args() 함수를 사용하여 매개변수 개수를 가져오고 method1 또는 method2 메서드를 자동으로 실행합니다. . func_get_arg(i)와 func_get_args() 함수를 결합하여 위의 예를 개선할 수 있습니다. 2. PHP5에서 오버로딩을 사용하세요
먼저 다음 예를 보세요.
코드는 다음과 같습니다.
<?php class Myclass { public $attriable; public $one = "this is one"; public $two = "this is two"; function construct() { } function one($one) { $this->one=$one; $this->attriable = $this->one; } function one($one, $two) { $this->one=$one; $this->two=$two; $this->attriable = $this->one . $this->two; } function display() { echo $this->attriable; } } $one = "this is my class"; $two = "Im the best"; $myclass = new myclass(); $myclass->one($one); $myclass->display(); $myclass->one($one, $two); $myclass->display(); //本例的做法,在 PHP 中是不正确的! ?>
메서드 오버로딩
을 구현하기 위한 고유한 메소드 세트를 가지고 있습니다(좋은지 나쁜지는 여기서 논의하지 않습니다). PHP5의 클래스는 PHP4의 클래스보다 훨씬 강력하지만 "오버로딩" 문제는 예상한 대로 "개선"되지 않았습니다. "오버로딩"은 C++, Java, C# 등과 같은 "강력한" 유형의 언어에서 다양한 매개변수 유형을 통해 달성될 수 있습니다. "고정 매개변수"가 전달되는 언어에서는 Java처럼 매개변수 개수만큼 전달될 수도 있지만, PHP는 약한 유형의 언어이므로 위와 같은 "오버로딩"은 발생하지 않습니다. PHP5에서는 get, set 및 call과 같은 몇 가지 특수 메서드를 통해 오버로드를 수행할 수 있습니다. Zend 엔진이 멤버에 액세스하려고 시도했지만 찾을 수 없을 때 PHP는 이러한 메서드를 호출합니다.
다음 예에서 get 및 set은 속성 변수 배열에 대한 모든 액세스를 바꿉니다. 필요한 경우 원하는 모든 유형의 필터링을 구현할 수도 있습니다. 예를 들어 스크립트는 속성 값 설정을 비활성화하거나 특정 접두사로 시작하거나 특정 유형의 값을 포함할 수 있습니다. 호출 메서드는 정의되지 않은 메서드를 호출하는 방법을 보여줍니다. 정의되지 않은 메소드를 호출하면 메소드 이름과 해당 메소드에서 받은 매개변수가 호출 메소드에 전달되고, PHP는 호출 값을 정의되지 않은 메소드에 반환합니다.
코드는 다음과 같습니다.
<?php class Overloader { private $properties = array(); function get($property_name) { if(isset($this->properties[$property_name])) { return($this->properties[$property_name]); } else { return(NULL); } } function set($property_name, $value) { $this->properties[$property_name] = $value; } public function call($method, $p) { print("Invoking $method()<br>\n"); //print("Arguments: "); //print_r($args); 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]); } } public function displayObject($p) { echo ("你传入的是个对象,内容如下:<br>"); print_r($p); echo "<hr>"; } public function displayArray($p) { echo ("你传入的是个数组,内容如下:<br>"); print_r($p); echo "<hr>"; } public function displayScalar($p) { echo ("你传入的是个单独变量,内容如下:<br>" . $p); echo "<hr>"; } } $o = new Overloader(); //调用 set() 给一个不存在的属性变量赋值 $o->dynaProp = "Dynamic Content"; //调用 get() print($o->dynaProp . "<br>\n"); //调用 call() //$o->dynaMethod("Leon", "Zeev"); $o->display(array(1,2,3)); $o->display('Cat'); ?>
위 내용은 PHP 메서드를 오버로드하는 두 가지 방법을 비교하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!