call_user_func_array php function

call_user_func_array - PHP call_user_func vs. función de solo llamar



function (8)

Estoy seguro de que hay una explicación muy fácil para esto. ¿Cuál es la diferencia entre esto?

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

... y esto (¿y cuáles son los beneficios?):

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


Al usar espacios de nombres, call_user_func () es la única forma de ejecutar una función, no se conoce el nombre de antemano, por ejemplo:

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

Si todas sus funciones estuvieran en el mismo espacio de nombres, entonces no sería un problema, ya que podría usar algo como esto:

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

Editar: Siguiendo a @ Jannis diciendo que estoy equivocado, hice un poco más de prueba y no tuve mucha suerte:

<?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()'' }

Puede ver los resultados de salida aquí: https://3v4l.org/iBERh parece que el segundo método funciona para PHP 7 en adelante, pero no PHP 5.6.


Aunque puede llamar nombres de funciones variables de esta manera:

function printIt($str) { print($str); } $funcname = ''printIt''; $funcname(''Hello world!'');

hay casos en los que no sabes cuántos argumentos estás pasando. Considera lo siguiente:

function someFunc() { $args = func_get_args(); // do something } call_user_func_array(''someFunc'',array(''one'',''two'',''three''));

También es útil para llamar a métodos estáticos y de objetos, respectivamente:

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


Con PHP 7 puede usar la sintaxis de función variable más agradable en todas partes. Funciona con funciones estáticas / de instancia, y puede tomar una matriz de parámetros. Más información en https://trowski.com/2015/06/20/php-callable-paradox

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


Me imagino que es útil para llamar a una función de la que no se conoce el nombre de antemano ... Algo como:

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


No hay beneficios al llamar a la función de esa manera porque creo que solía llamar a la función de "usuario" (como el complemento) porque editar el archivo principal no es una buena opción. aquí está el sucio ejemplo usado por 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 ?>

salida

hello world my name is Tasikmalaya


Siempre use el nombre de la función real cuando lo sepa.

call_user_func es para llamar a funciones cuyo nombre no conoce de antemano, pero es mucho menos eficiente ya que el programa debe buscar la función en tiempo de ejecución.


en su primer ejemplo está usando nombre de función que es una cadena. podría venir del exterior o determinarse sobre la marcha. es decir, no sabe qué función deberá ejecutarse en el momento de la creación del código.


la opción call_user_func está ahí para que pueda hacer cosas como:

$dynamicFunctionName = "barber"; call_user_func($dynamicFunctionName, ''mushroom'');

donde la cadena dynamicFunctionName podría ser más emocionante y generarse en tiempo de ejecución. No debe usar call_user_func a menos que sea necesario, porque es más lento.