webentwicklung-frage-antwort-db.com.de

PHP call_user_func vs. nur aufrufende Funktion

Ich bin sicher, dass es eine sehr einfache Erklärung dafür gibt. Was ist der Unterschied zwischen diesem: 

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

... und das (und was sind die Vorteile?):

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

Verwenden Sie immer den tatsächlichen Funktionsnamen, wenn Sie ihn kennen.

call_user_func ist für den Aufruf von Funktionen gedacht, deren Namen Sie nicht im Voraus kennen. Sie ist jedoch weniger effizient, da das Programm die Funktion zur Laufzeit nachschlagen muss.

79
Kai

Sie können zwar variable Funktionsnamen auf diese Weise aufrufen:

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

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

es gibt Fälle, in denen Sie nicht wissen, wie viele Argumente Sie übergeben. Folgendes berücksichtigen:

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

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

Es ist auch praktisch, um statische und Objektmethoden aufzurufen:

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

die call_user_func-Option ist vorhanden, sodass Sie Folgendes tun können:

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');

der String dynamicFunctionName könnte aufregender sein und zur Laufzeit generiert werden. Sie sollten call_user_func nur verwenden, wenn dies erforderlich ist, da dies langsamer ist.

15
Brian Schroth

Ich kann mir vorstellen, dass es nützlich ist, eine Funktion aufzurufen, deren Namen Sie nicht kennen ...

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

call_user_func($func, 'stuff');
7
pivotal

Es gibt keine Vorteile, wenn man die Funktion so aufruft, weil ich denke, es wurde hauptsächlich zum Aufruf der "Benutzer" -Funktion (wie Plugin) verwendet, weil das Bearbeiten der Kerndatei keine gute Option ist. Hier sind ein schmutziges Beispiel, das von Wordpress verwendet wird

<?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
?>

ausgabe

hello world my name is Tasikmalaya
3
uingtea

Mit PHP 7 können Sie überall die schönere Variablenfunktions-Syntax verwenden. Es arbeitet mit statischen/Instanzfunktionen und kann ein Array von Parametern enthalten. Mehr Infos unter https://trowski.com/2015/06/20/php-callable-paradox

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

in Ihrem ersten Beispiel verwenden Sie den Funktionsnamen, der eine Zeichenfolge ist. es könnte von außen kommen oder fliegend bestimmt werden. Sie wissen also nicht, welche Funktion zum Zeitpunkt der Codeerstellung ausgeführt werden muss.

0
SilentGhost