web-dev-qa-db-fra.com

PHP call_user_func vs simplement appeler une fonction

Je suis sûr qu'il y a une explication très simple à cela. Quelle est la différence entre ceci: 

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

... et ceci (et quels sont les avantages?):

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

Utilisez toujours le nom de la fonction lorsque vous le connaissez.

call_user_func est utilisé pour appeler des fonctions dont vous ne connaissez pas le nom à l'avance, mais qui sont beaucoup moins efficaces, car le programme doit rechercher la fonction au moment de l'exécution.

79
Kai

Bien que vous puissiez appeler des noms de fonction variables de cette façon:

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

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

il y a des cas où vous ne savez pas combien d'arguments vous transmettez. Considérer ce qui suit:

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

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

C'est aussi pratique pour appeler des méthodes static et object, respectivement:

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

l'option call_user_func est là pour vous permettre de faire les choses suivantes:

$dynamicFunctionName = "barber";

call_user_func($dynamicFunctionName, 'mushroom');

où la chaîne dynamicFunctionName pourrait être plus intéressante et générée au moment de l'exécution. Vous ne devriez pas utiliser call_user_func à moins que vous n'ayez à le faire, car c'est plus lent.

15
Brian Schroth

J'imagine que c'est utile pour appeler une fonction dont vous ne connaissez pas le nom d'avance .... Quelque chose comme:

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

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

Il n’ya aucun avantage à appeler la fonction de cette manière car je pense que c’est surtout pour appeler la fonction "utilisateur" (comme un plugin) car la modification du fichier principal n’est pas une bonne option. voici un exemple sale utilisé par 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
?>

sortie

hello world my name is Tasikmalaya
3
uingtea

Avec PHP 7, vous pouvez utiliser partout la syntaxe plus pratique des fonctions variables. Cela fonctionne avec des fonctions static/instance, et cela peut prendre un tableau de paramètres. Plus d'infos sur https://trowski.com/2015/06/20/php-callable-paradox

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

dans votre premier exemple, vous utilisez le nom de la fonction, qui est une chaîne. cela peut venir de l'extérieur ou être déterminé à la volée. En d'autres termes, vous ne savez pas quelle fonction devra être exécutée au moment de la création du code.

0
SilentGhost