함수 - php user func call




PHP call_user_func 대 함수 호출 (6)

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

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

이것에 대한 아주 쉬운 설명이있을 것입니다. 이 차이점은 무엇입니까?

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');

귀하의 첫 번째 예에서는 문자열 인 함수 이름을 사용하고 있습니다. 그것은 외부에서 올지도 모르고 또는 비행 중에 결정될지도 모른다. 즉, 코드 작성 순간에 어떤 기능을 실행해야하는지 알 수 없습니다.


네임 스페이스를 사용할 때 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에서는 작동하지 않는 것 같습니다.


이런 식으로 변수 함수 이름을 호출 할 수는 있지만 :

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);

핵심 파일을 편집하는 것이 좋은 옵션이 아니기 때문에 주로 플러그인과 같은 "사용자"함수를 호출하는 데 주로 사용되었다고 생각하기 때문에이 기능을 호출하면 이점이 없습니다. 여기에 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

call_user_func 옵션이 있으므로 다음과 같은 작업을 수행 할 수 있습니다.

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');

여기서 dynamicFunctionName 문자열은 런타임에 더욱 재미 있고 생성 될 수 있습니다. 호출 속도가 느리기 때문에 call_user_func를 사용해야합니다.





function