>백엔드 개발 >PHP 튜토리얼 >PHP 메서드를 오버로드하는 두 가지 방법을 비교하는 예

PHP 메서드를 오버로드하는 두 가지 방법을 비교하는 예

伊谢尔伦
伊谢尔伦원래의
2017-07-08 09:51:452711검색

"오버로딩"은 클래스의 다형성 구현입니다. 함수 오버로딩(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 &#39;method2&#39;; 
} 
} 
//通过在类中的额外的处理,使用这个类对用户是透明的: 
$obj1 = new Myclass(&#39;A&#39;); //将调用 method1 
$obj2 = new Myclass(&#39;B&#39;,&#39;C&#39;); //将调用 method2 
?>

위 코드에서

constructor

의 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 中是不正确的! 
?>

C++, Java, C#에서 오버로딩을 사용해본 사람들은 습관적으로 위의 오버로딩을 씁니다. 구현된 PHP 코드. 그러나 이것은 PHP5에서는 사실이 아닙니다. PHP5는 앞서 언급한 언어를 모방한 것이 아니지만

메서드 오버로딩
을 구현하기 위한 고유한 메소드 세트를 가지고 있습니다(좋은지 나쁜지는 여기서 논의하지 않습니다). 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 == &#39;display&#39;) 
{ 
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(&#39;Cat&#39;); 
?>

위 코드에서는 display() 메소드가 호출되는데, 매개변수의 종류와 개수에 따라 클래스의 해당 코드 세그먼트를 호출하여 오버로딩을 실현할 수 있습니다. 객체 메소드의

위 내용은 PHP 메서드를 오버로드하는 두 가지 방법을 비교하는 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.