>  기사  >  백엔드 개발  >  PHP의 is_callable() 및 method_exists() 함수

PHP의 is_callable() 및 method_exists() 함수

青灯夜游
青灯夜游앞으로
2020-04-02 09:51:022916검색

PHP의 is_callable() 및 method_exists() 함수

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

<?php
if (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。

<?php
if (is_callable(array($object, &#39;SomeMethod&#39;))) {
      $object->SomeMethod($this, TRUE); 
}?>

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

<?php
class 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()

<?php
class 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;;

두 함수의 차이점을 설명하기 위해 예를 들어보겠습니다.

Calling object method runtest in object context 
bool(false) bool(true)

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

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

객체에 매직 메소드 __call이 있는 경우 method_exists()는 메소드 판단 시 FALSE를 반환하고 is_callable()은 TRUE를 반환합니다. . rrreee실행 결과

rrreee🎜🎜🎜🎜권장: 🎜PHP 비디오 튜토리얼🎜🎜

위 내용은 PHP의 is_callable() 및 method_exists() 함수의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제