PHP는 약한 유형의 언어이므로 함수의 입력 매개변수 유형을 결정할 수 없습니다(유형 힌트는 사용할 수 있지만 정수, string와 같은 스칼라 유형에는 유형 힌트를 사용할 수 없음). 예를 들어, 함수는 3개의 입력 매개변수만 정의하지만 PHP는 호출 시 4개 이상의 매개변수를 입력합니다. 따라서 이 두 가지 점을 토대로 PHP에서는 함수가 오버로드될 수 없으며(Javascript 언어와 유사) 생성자의 오버로드가 있을 수 없습니다.
함수 오버로딩을 구현하는 것은 개발 효율을 높이는 데 큰 도움이 되므로 C#이나 C++처럼 하면 좋을 것 같습니다. 실제로 PHP는 magic method, 혼합 호출(문자열 이름, 배열 인수)을 제공합니다. 이 방법은 php 매뉴얼에도 언급되어 있습니다. 공식 문서에 따르면 이 방법을 사용하면 함수 오버로딩이 가능하다고 합니다. 객체에 존재하지 않는 메소드를 호출할 경우 call() 메소드를 정의하면 해당 메소드가 호출됩니다. 예를 들어 다음 코드는
<?php class A { function call ( $name, $arguments ) { echo "call调用<br/>"; echo '$name为'.$name."<br/>"; print_r ($arguments); } } (new A)->test("test","argument"); ?>
실행 결과는 다음과 같습니다.
call call
$name is test
Array ( [0] => test [1] => 인수 )
그래서 필요한 것은 이 마법의 방법을 사용하려면 함수 오버로딩을 달성할 수 있습니다.
코드는 다음과 같습니다:
<?php class A { function call ($name, $args ) { if($name=='f') { $i=count($args); if (method_exists($this,$f='f'.$i)) { call_user_func_array(array($this,$f),$args); } } } function f1($a1) { echo "1个参数".$a1."<br/>"; } function f2($a1,$a2) { echo "2个参数".$a1.",".$a2."<br/>"; } function f3($a1,$a2,$a3) { echo "3个参数".$a1.",".$a2.",".$a3."<br/>"; } } (new A)->f('a'); (new A)->f('a','b'); (new A)->f('a','b','c'); 输出如下: 1个参数a 2个参数a,b 3个参数a,b,c
마찬가지로 PHP에서는 생성자 오버로드가 유연한 방식으로만 구현될 수 있습니다. 구현의 핵심 요소는 입력 매개변수를 얻고 입력 매개변수에 따라 호출할 메소드를 결정하는 것입니다. 다음은 샘플 코드입니다.
<?php class A { function construct() { echo "执行构造函数<br/>"; $a = func_get_args(); //获取构造函数中的参数 $i = count($a); if (method_exists($this,$f='construct'.$i)) { call_user_func_array(array($this,$f),$a); } } function construct1($a1) { echo "1个参数".$a1."<br/>"; } function construct2($a1,$a2) { echo "2个参数".$a1.",".$a2."<br/>"; } function construct3($a1,$a2,$a3) { echo "3个参数".$a1.",".$a2.",".$a3."<br/>"; } } $o = new A('a'); $o = new A('a','b'); $o = new A('a','b','c'); ?>
생성자 실행
1 매개변수 a
생성자 실행
2 매개변수 a,b
생성자 실행
3 매개변수 a,b,c
그런데 c# 등. 객체 지향동일한 언어인 PHP에서는 생성자가 비공개 또는 보호로 설정된 경우 객체를 인스턴스화할 수 없습니다.
위 내용은 PHP에서 함수 및 생성자의 오버로드 예제를 구현하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!