> 백엔드 개발 > PHP 튜토리얼 > PHP의 is_callable()과 method_exists() 함수 간의 구체적인 차이점 소개

PHP의 is_callable()과 method_exists() 함수 간의 구체적인 차이점 소개

黄舟
풀어 주다: 2023-03-14 20:36:02
원래의
1378명이 탐색했습니다.

많은 제품 응용 프로그램에서 객체에 메소드가 존재하는지 확인하는 데 사용되는 다음과 같은 사용법을 자주 볼 수 있습니다.

<?phpif (method_exists($object, &#39;SomeMethod&#39;)) {   
    $object->SomeMethod($this, TRUE); 
}?>
로그인 후 복사

이 코드의 목적은 비교적 이해하기 쉽습니다. $object라는 개체가 있습니다. 그렇다면 SomeMethod라는 메서드가 있는지 알고 싶습니다.

이 코드는 정확해 보이며 대부분의 경우 정상적으로 실행됩니다. 그런데 이 $object 객체의 메소드가 현재 실행 중인 환경에 보이지 않는 경우에도 프로그램이 정상적으로 실행될 수 있을까요? 이 함수 이름 메서드가 존재하는 것처럼 우리가 제공하는 클래스나 객체에 우리가 기대하는 메서드가 있는지 확인하고, 있으면 TRUE를 반환하고, 없으면 FALSE를 반환합니다. 따라서 비공개 또는 보호된 메서드를 결정하면 올바른 반환을 얻을 수 있지만 실행하면 "치명적인 오류" 오류 경고가 표시됩니다.

위 코드의 실제 의도는 다음과 같이 이해해야 합니다. 제공된 클래스 또는 개체에 대해 현재 범위에서 SomeMethod 메서드를 호출할 수 있습니까? 그리고 이것이 바로 is_callable() 함수의 목적입니다. is_callable() 함수는 함수 이름이나 메서드 이름과 개체가 포함된 배열을 지정할 수 있는 콜백 매개변수를 받습니다. 현재 범위에서 실행될 수 있으면 TRUE를 반환합니다. is_callable()函数存在的目的。is_callable()函数接收一个回调参数,可以指定一个函数名称或者一个包含方法名和对象的数组,如果在当前作用域中可以执行,就返回TRUE。

<?phpif (is_callable(array($object, &#39;SomeMethod&#39;))) {      
$object->SomeMethod($this, TRUE); 
}?>
로그인 후 복사

下面来举个例子来说明两者的区别

<?phpclass Foo {
    public function PublicMethod(){}    
    private function PrivateMethod(){}    
    public static function PublicStaticMethod(){}    
    private static function PrivateStaticMethod(){}
}$foo = new Foo();$callbacks = array(    
array($foo, &#39;PublicMethod&#39;),    
array($foo, &#39;PrivateMethod&#39;),    
array($foo, &#39;PublicStaticMethod&#39;),    
array($foo, &#39;PrivateStaticMethod&#39;),    
array(&#39;Foo&#39;, &#39;PublicMethod&#39;),    
array(&#39;Foo&#39;, &#39;PrivateMethod&#39;),    
array(&#39;Foo&#39;, &#39;PublicStaticMethod&#39;),    
array(&#39;Foo&#39;, &#39;PrivateStaticMethod&#39;),
   );foreach ($callbacks as $callback){
    var_dump($callback);
    var_dump(method_exists($callback[0], $callback[1]));
    var_dump(is_callable($callback));    
    echo str_repeat(&#39;-&#39;, 10);    
    echo &#39;<br />&#39;;
}
로그인 후 복사

执行上面的脚本后,我们会清晰地看到两个函数间的差别。

is_callable()还有其他的用法,例如,不检查所提供的类或方法,只检查函数或方法的语法是否正确。像method_exists()一样,is_callable()可以触发类的自动加载。

如果一个对象存在魔术方法__call,在进行方法判断时method_exists()会返回FALSE,而is_callable()

<?phpclass MethodTest {
    public function __call($name, $arguments){
      echo &#39;Calling object method &#39; . $name . &#39; &#39; .implode(&#39;, &#39;, $arguments);      echo &#39;<br />&#39;;
    }
}$obj = new MethodTest();$obj->runtest(&#39;in object context&#39;);
var_dump(method_exists($obj,&#39;runtest&#39;));
var_dump(is_callable(array($obj,&#39;runtest&#39;)));echo &#39;<br />&#39;;
로그인 후 복사
두 함수의 차이점을 설명하기 위해 예를 들어보겠습니다.

rrreee

위 스크립트를 실행하면 두 함수의 차이점을 명확하게 볼 수 있습니다.


is_callable()에는 다른 용도도 있습니다. 예를 들어 제공된 클래스나 메서드를 확인하지 않고 함수나 메서드의 구문이 올바른지 확인만 합니다. method_exists()와 마찬가지로 is_callable()은 클래스 자동 로드를 트리거할 수 있습니다.

객체에 매직 메소드 __call이 있는 경우 method_exists()는 메소드 판단 시 FALSE를 반환하고 is_callable()은 TRUE를 반환합니다. . PHP의 is_callable()과 method_exists() 함수 간의 구체적인 차이점 소개rrreee

실행 결과🎜🎜객체 컨텍스트에서 객체 메서드 runtest 호출 🎜bool(false) bool(true)🎜🎜🎜🎜

위 내용은 PHP의 is_callable()과 method_exists() 함수 간의 구체적인 차이점 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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