> 백엔드 개발 > PHP 문제 > PHP __call() 메소드의 두 번째 매개변수에 집중하세요.

PHP __call() 메소드의 두 번째 매개변수에 집중하세요.

PHPz
풀어 주다: 2023-04-12 11:23:13
원래의
691명이 탐색했습니다.

PHP의 매직 메소드 중 하나는 __call()입니다. __call() 메서드는 존재하지 않는 메서드를 자동으로 호출하는 데 사용됩니다. 이 메서드는 클래스에 정의되어 있습니다. 객체가 존재하지 않거나 권한이 부족한 메서드를 호출하면 시스템은 자동으로 __call() 메서드를 호출합니다. __call() 메소드는 메소드 이름과 매개변수 목록이라는 두 개의 매개변수를 허용합니다. 이 글에서는 매개변수 목록인 __call() 메서드의 두 번째 매개변수에 중점을 둘 것입니다.

__call() 메소드 사용법

PHP에서 __call() 메소드 정의 형식은 다음과 같습니다.

public function __call($name, $arguments)
{
    //处理调用$name方法时传递的$arguments参数
}
로그인 후 복사

$name 매개변수는 호출된 메소드의 이름이고, $arguments 매개변수는 전달된 매개변수 배열입니다. 방법에.

예는 다음과 같습니다.

class MyClass
{
    public function __call($name, $arguments)
    {
        echo "调用方法 $name() 时,传递了以下参数:";
        print_r ($arguments);
    }
}

$obj = new MyClass();
$obj->hello("World", 123);
로그인 후 복사

이 예에서는 클래스에 존재하지 않는 메서드 호출을 처리하기 위해 __call() 메서드가 있는 MyClass 클래스를 정의합니다. MyClass 객체를 생성하고 hello() 메서드를 호출합니다. MyClass 클래스에 hello() 메서드가 존재하지 않기 때문에 시스템은 자동으로 __call() 메서드를 호출하고 메서드 이름 hello와 매개 변수 목록 ["World", 123]을 매개 변수로 __call() 메서드에 전달합니다. __call() 메서드는 다음 결과를 출력합니다.

调用方法 hello() 时,传递了以下参数:Array ( [0] => World [1] => 123 )
로그인 후 복사

__call() 메서드의 매개변수 목록

__call() 메서드에서 두 번째 매개변수인 $arguments는 호출된 메서드가 전달한 모든 매개변수를 포함하는 배열입니다. 이러한 매개변수는 $arguments에 배열로 저장됩니다. __call() 메서드 내에서 다음과 유사한 코드를 사용하여 이러한 매개변수를 얻을 수 있습니다.

public function __call($name, $arguments)
{
    $arg_count = count($arguments);
    for($i=0; $i<$arg_count; $i++){
        echo $arguments[$i]."<br>";
    }
}
로그인 후 복사

이 예에서는 count() 함수를 사용하여 매개변수 수를 계산한 다음 for 루프를 사용하여 매개변수를 하나씩.

매직 메서드의 적용 시나리오

__call() 메서드를 사용하면 클래스를 더 유연하고 쉽게 확장할 수 있습니다. 정의된 클래스가 동적으로 메서드를 호출해야 하는 경우 __call() 메서드는 큰 도움을 줄 수 있습니다. 다음은 __call() 메서드에 대한 몇 가지 응용 프로그램 시나리오입니다.

  1. 객체에 대한 동적으로 메서드 호출

웹 응용 프로그램에는 일반적으로 다양한 모듈과 작업이 있습니다. 정의된 클래스가 동적으로 메서드를 호출해야 하는 경우 __call()을 사용하는 것이 더 적합합니다. 예:

class Show    
{    
    public function showtext() {    
        return '这是一个文本框';    
    }    
    public function showbutton() {    
        return '这是一个按钮';    
    }    
    public function showselect() {    
        return '这是一个下拉列表';    
    }   
    public function __call($name, $arguments) {    
        return '您调用的方法:'.$name.'(参数:'.implode(',',$arguments).')不存在';    
    }    
}  
$obj = new Show();  
echo $obj->showText().'<br>';    
echo $obj->showButton().'<br>';    
echo $obj->showSelect('',2,3).'<br>';    
echo $obj->test('param1',2).'<br>';
로그인 후 복사

출력 결과는 다음과 같습니다.

这是一个文本框
这是一个按钮
这是一个下拉列表
您调用的方法:test(参数:param1,2)不存在
로그인 후 복사

__call() 메서드를 호출하면 클래스에서 메서드 호출을 동적으로 구현하고 존재하지 않는 메서드 호출을 균일하게 처리할 수 있습니다.

  1. 인터페이스 클래스 확장 구현

때때로 기존 코드 베이스에 새로운 메서드를 추가해야 하지만 기존 클래스를 직접 수정할 수는 없습니다. 이 경우 __call() 메서드를 사용하여 대리자 메서드를 구현하고 호출을 다른 클래스로 전달할 수 있습니다. 예:

interface InterfaceA{ 
    public function sayHello($name); 
}

class ClassA implements InterfaceA { 
  public function sayHello($name){                  
      echo 'ClassA: Hello,'.$name.'<br>';                      
  } 
} 

class ClassB { 
  public function __call($name,$arguments){                  
      if($name == 'sayHello'){                     
        $obj = new ClassA(); 
        return $obj->sayHello($arguments[0]); 
      } 
  }   
} 

$obj = new ClassB(); 
$obj->sayHello('World');
로그인 후 복사

이 예에서는 InterfaceA 인터페이스와 이를 구현하는 ClassA 클래스를 정의합니다. 그런 다음 ClassB 클래스를 정의하고 위임을 사용하여 ClassA 메서드를 호출하는 __call() 메서드를 구현했습니다. 마지막으로 ClassB의 객체를 생성하고 sayHello() 메소드를 호출합니다. sayHello() 메소드는 ClassB에서 구현되지 않으므로 시스템은 자동으로 __call() 메소드를 호출하고 메소드 이름과 메소드 매개변수를 매개변수로 전달합니다. __call() 메서드는 여기에서 반복기와 동일합니다.

요약

이 기사에서는 PHP의 매우 실용적인 매직 메소드인 __call()을 소개했습니다. __call() 메서드의 정의, 호출 방법, 매개변수 목록의 역할에 대해 배웠습니다. __call() 메서드를 사용하면 클래스에 동적으로 메서드를 호출하는 기능을 추가할 수 있어 프로그램을 더욱 유연하고 쉽게 확장할 수 있습니다. 이 글을 통해 여러분은 __call() 메소드에 대해 더 명확하게 이해하고 이를 실제로 더 잘 적용할 수 있을 것입니다.

위 내용은 PHP __call() 메소드의 두 번째 매개변수에 집중하세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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