PHP call_user_func 대 호출 함수


92

나는 이것에 대한 매우 쉬운 설명이 있다고 확신합니다. 이것의 차이점은 무엇입니까?

function barber($type){
    echo "You wanted a $type haircut, no problem\n";
}
call_user_func('barber', "mushroom");
call_user_func('barber', "shave");

... 그리고 이것 (그리고 이점은 무엇입니까?) :

function barber($type){
    echo "You wanted a $type haircut, no problem\n";
}
barber('mushroom');
barber('shave');

답변:


88

알면 항상 실제 함수 이름을 사용하십시오.

call_user_func 이름을 미리 알 수없는 함수를 호출하기위한 것이지만 프로그램이 런타임에 함수를 조회해야하기 때문에 훨씬 덜 효율적입니다.


44
call_user_func반드시 필요한 것은 아닙니다. 항상 변수 함수를 사용하여 함수를 호출 할 수 있습니다 $some_func().. call_user_func_array정말 유용합니다.
Ionuț G. Stan

23
PHP는 항상 "런타임에 함수를 조회하기 위해"가 필요합니다
VolkerK 2010 년

2
@Pacerier 올바르지 않습니다. 익명 함수는 여전히 변수에 $func = function(){};있습니다. call_user_func에 대한 모든 가능한 매개 변수는 액세스 충분한 데이터를 포함하는 의미 호출 할 수 있습니다 그것은 바로, 그의 여부 $func(), 또는 $obj->{$func}(), 또는 무엇 이건.
Benubird

2
"덜 효율적"은 실제로 매우 적습니다. 특히 php7 이후로 약 몇 ms / 백만 호출입니다. github.com/fab2s/call_user_func
fab2s

1
소스 에 따르면 "변수를 통해 존재하지 않는 함수를 호출하면 치명적인 오류가 발생하고 call_user_func ()는 경고를 반환합니다." 이것이 하나의 차이점입니다.
mbomb007

32

이 방법으로 변수 함수 이름을 호출 할 수 있지만 :

function printIt($str) { print($str); }

$funcname = 'printIt';
$funcname('Hello world!');

당신이 얼마나 많은 주장을 전달하는지 모르는 경우가 있습니다. 다음을 고려하세요:

function someFunc() {
  $args = func_get_args();
  // do something
}

call_user_func_array('someFunc',array('one','two','three'));

또한 각각 정적 및 개체 메서드를 호출하는 데 편리합니다.

call_user_func(array('someClass','someFunc'),$arg);
call_user_func(array($myObj,'someFunc'),$arg);

8
나는 이것이 오래되었다는 것을 알고 있지만 다른 곳에서 기사를 찾을 수 없습니다. $ variableFunction ()에 따라 call_user_func ( 'customFunction')을 사용하는 것이 더 유리합니까? 차이점은 무엇입니까? 감사!
David Hobs

14

call_user_func당신이 좋아하는 일을 할 수 있도록 옵션이 있습니다 :

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');

를 Where dynamicFunctionName문자열은 더 흥미 진진하고 런타임에 생성 될 수 있습니다. 필요하지 않으면 call_user_func를 사용하면 안됩니다. 더 느리기 때문입니다.


2
이 시나리오에서 가변 함수를 사용할 수있는 것 같습니다.
Anthony Rutledge

5

이름을 미리 모르는 함수를 호출하는 데 유용하다고 생각합니다.

switch($value):
{
  case 7:
  $func = 'run';
  break;
  default:
  $func = 'stop';
  break;
}

call_user_func($func, 'stuff');

6
아니. 우리는 여전히 할 수있는$func('stuff');
ankush981

1
예,하지만 변수를 사용하면 call_user_func가 사용되는 경우 PHP 경고와 비교하여 PHP 치명적 오류가 발생한다는 차이점이 있습니다.
Robert Brisita

이것은 call_user_func()이 시나리오에서 변수 함수의 가치를 부정하지 않았습니다 .
Anthony Rutledge

5

PHP 7을 사용하면 어디에서나 더 멋진 가변 함수 구문을 사용할 수 있습니다. 정적 / 인스턴스 함수와 함께 작동하며 매개 변수 배열을 사용할 수 있습니다. https://trowski.com/2015/06/20/php-callable-paradox 에서 자세한 정보

$ret = $callable(...$params);

AFAICT, 이것은 정말로 질문에 답하는 유일한 대답입니다.
Mormegil

3

코어 파일을 편집하는 것은 좋은 옵션이 아니기 때문에 주로 "사용자"함수 (플러그인과 같은)를 호출하는 데 사용되었다고 생각하기 때문에 그런 함수를 호출하는 이점은 없습니다. 다음은 Wordpress에서 사용하는 더러운 예입니다.

<?php
/* 
* my_plugin.php
*/

function myLocation($content){
  return str_replace('@', 'world', $content);
}

function myName($content){
  return $content."Tasikmalaya";
}

add_filter('the_content', 'myLocation');
add_filter('the_content', 'myName');

?>

...

<?php
/*
* core.php
* read only
*/

$content = "hello @ my name is ";
$listFunc = array();

// store user function to array (in my_plugin.php)
function add_filter($fName, $funct)
{
  $listFunc[$fName]= $funct;
}

// execute list user defined function
function apply_filter($funct, $content)
{
  global $listFunc;

  if(isset($listFunc))
  {
    foreach($listFunc as $key => $value)
    {
      if($key == $funct)
      {
        $content = call_user_func($listFunc[$key], $content);
      }
    }
  }
  return $content;
}

function the_content()
{
  $content = apply_filter('the_content', $content);
  echo $content;
}

?>

....

<?php
require_once("core.php");
require_once("my_plugin.php");

the_content(); // hello world my name is Tasikmalaya
?>

산출

hello world my name is Tasikmalaya

0

첫 번째 예에서는 문자열 인 함수 이름을 사용하고 있습니다. 그것은 외부에서 오거나 즉석에서 결정될 수 있습니다. 즉, 코드 생성 시점에 어떤 기능을 실행해야하는지 알 수 없습니다.


-1

네임 스페이스를 사용할 때 call_user_func ()는 이름을 미리 모르는 함수를 실행하는 유일한 방법입니다. 예를 들면 다음과 같습니다.

$function = '\Utilities\SearchTools::getCurrency';
call_user_func($function,'USA');

모든 함수가 동일한 네임 스페이스에 있다면 다음과 같이 사용할 수 있으므로 문제가되지 않습니다.

$function = 'getCurrency';
$function('USA');

편집 : @Jannis를 따라 내가 틀렸다고 말하면서 나는 조금 더 테스트를했고 많은 운이 없었습니다.

<?php
namespace Foo {

    class Bar {
        public static function getBar() {
            return 'Bar';
        }
    }
    echo "<h1>Bar: ".\Foo\Bar::getBar()."</h1>";
    // outputs 'Bar: Bar'
    $function = '\Foo\Bar::getBar';
    echo "<h1>Bar: ".$function()."</h1>";
    // outputs 'Fatal error: Call to undefined function \Foo\Bar::getBar()'
    $function = '\Foo\Bar\getBar';
    echo "<h1>Bar: ".$function()."</h1>";
    // outputs 'Fatal error: Call to undefined function \foo\Bar\getBar()'
}

여기에서 출력 결과를 볼 수 있습니다 : https://3v4l.org/iBERh 두 번째 방법은 PHP 7 이상에서는 작동하지만 PHP 5.6에서는 작동하지 않는 것 같습니다.


1
. 사실이 아니기 때문입니다. $ fn = '\ Foo \ Bar \ getCurrency'; $ fn ();
Jan Sverre 2014 년

안녕하세요 @Jannis, 나는 그것이 사실이라고 생각하지 않습니다. 아마 내가 어디로 잘못 가고 있는지 알 수 있습니다. 내 대답에 더 자세한 예를 추가했습니다.
ThomasRedstone

@ThomasRedstone 사전에 이러한 기능이 필요 했습니까? PHP는 다른 파일에서 함수를 자동로드하지 않습니다. 또한 네임 스페이스의 작은 글자와 큰 글자는 무엇입니까? Bar는 수업인가요? 또 다른 사용 사례입니다.
przemo_li 2011

안녕하세요 @przemo_li, 이것은 하나의 파일입니다 (모두 네임 스페이스 내). 실제 출력을 볼 수있는 링크가있는 PHP 7, 나는 여전히 jansverre가 어떻게 작동했는지 모르겠다. PHP 7은 2015 년 6 월 11 일까지 알파에 들어 가지 않았다
ThomasRedstone 17
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.