변수가 함수인지 확인하는 php is_function ()


89

PHP의 익명 함수 에 대해 읽게되어 매우 기뻤습니다. 이 함수를 사용하면 create_function으로 할 수있는 것보다 더 쉽게 함수 인 변수를 선언 할 수 있습니다. 이제 변수가 전달 된 함수가 있는지 궁금합니다. 함수인지 확인하기 위해 어떻게 확인할 수 있습니까? 아직 is_function () 함수가 없으며 함수 인 변수의 var_dump를 수행 할 때 ::

$func = function(){
    echo 'asdf';
};
var_dump($func);

나는 이것을 얻는다 :

object(Closure)#8 (0) { } 

이것이 기능인지 확인하는 방법에 대한 생각이 있습니까?

답변:


141

is_callable주어진 변수가 함수인지 확인하는 데 사용 합니다. 예를 들면 :

$func = function()
{  
    echo 'asdf';  
};

if( is_callable( $func ) )
{
    // Will be true.
}

10
is_callable ()은 익명 함수를 전달하든, 함수 이름을 문자열로 전달하든, 유효한 PHP 콜백 배열을 전달하든 훌륭하게 작동합니다. 익명 함수 만 확인하고 싶다면 Gumbo가 말한 것과 같은 것을 원할 것입니다. 매개 변수가 객체인지 확인하고 Closure의 인스턴스인지 확인합니다.
Lane

2
callack인지 문자열인지 확인하고 다른 작업을 수행하려면 어떻게해야합니까? 문자열 값이 실수로 콜백으로 사용되는 것을 원하지 않습니다.
Gherman

3
@German 그냥 체크 첫째 is_callable ($ FUNC)와 두 번째 검사로 다음 ($ FUNC)를 is_string 경우
Heroselohim

4
위의 코드 스 니펫으로 인해 문제가 발생했습니다. 나는 "Date"라는 레이블이 붙은 문자열을 의도했고 그 다음 클로저로 처리되어 실행되었습니다. 올바른 방법은 if ​​(($ variable instanceof Closure) && is_callable ($ variable)) {...}
Basil Musa

1
클로저 AND가 호출 가능한 이유. 폐쇄는 언제 호출 할 수 없습니까? 시간이 있다면 놀라지 않을 것입니다. 그러나 두 가지 확인이 필요한 이유가 궁금합니다.
Joel M

34

function_exists주어진 이름을 가진 함수가 있는지 확인 하는 데 사용할 수 있습니다 . 익명 함수와 결합하려면 다음을 시도하십시오.

function is_function($f) {
    return (is_string($f) && function_exists($f)) || (is_object($f) && ($f instanceof Closure));
}

감사합니다! 내 앱을 사용하면 사용자가 자신의 해싱 함수를 지정하거나 또는 대신 hash ()에 대한 인수를 제공 할 수 있습니다. 그러나 유효한 해싱 알고리즘 중 일부는 PHP 내장 기능이므로 호출 가능합니다 (예 : 'md5', 'sha1'). is_object()그리고 instanceof Closure이 확인하기 위해 훨씬 더 강력한 방법입니다!
njbair

is_string 및 function_exists 호출을 제거하면 이것이 람다 함수를 감지하는 데 사용하려는 함수입니다. 감사합니다!

30

변수가 호출 가능한 문자열이나 배열이 아닌 익명 함수인지 확인하려면 instanceof.

$func = function()
{  
    echo 'asdf';  
};

if($func instanceof Closure)
{
    // Will be true.
}

익명 함수 (PHP 5.3에 추가 된 종류)는 항상 Closure클래스의 인스턴스이며 클래스의 모든 인스턴스 Closure는 익명 함수입니다.

PHP에는 틀림없이 함수로 간주 될 수있는 또 다른 유형이 있습니다 __invoke. 바로 매직 메서드 를 구현하는 객체입니다 . 포함하려면 (문자열과 배열은 제외하고) method_exists($func, '__invoke'). 클로저 __invoke는 일관성을 위해 구현되기 때문에 여전히 클로저를 포함 합니다.


8
이는 is_callable()전달 된 문자열 또는 배열을 기반으로 호출 할 메서드를 찾으려고 시도하기 때문에 특히 유용합니다. 이 경우 클래스가 자동로드 될 수 있고 예상 / 필요한 동작이 아닐 수 있습니다.
spikyjt 2015

2
function is_function($f) {
    return is_callable($f) && !is_string($f);
}

앞으로 PHP는 다른 언어가 이미하는 것처럼 gettype ()을 Object에서 Callable로 변경할 수 있습니다. 따라서이 답변은 아마도 가장 좋은 방법 일 것입니다. 그러나 이것은 다음과 같이 최적화 될 수 있습니다 : return! is_string ($ f) &&! is_array ($ f) && is_callable ($ f).
Alexandre T.

0

PHP에서 유효한 callables 함수, 함수 (문자열) 및 형태의 배열의 이름이 될 수 있습니다 ['className', 'staticMethod']또는 [$object, 'method']너무 기능이 문자열과 배열을 제외해야만을 검출하기 :

function isFunction($callable) {
    return $callable && !is_string($callable) && !is_array($callable) && is_callable($callable);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.