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