Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何从存储在变量中的字符串调用函数?_Php_Dynamic Function - Fatal编程技术网

Php 如何从存储在变量中的字符串调用函数?

Php 如何从存储在变量中的字符串调用函数?,php,dynamic-function,Php,Dynamic Function,我需要能够调用函数,但函数名存储在变量中,这可能吗?e、 g: 函数foo() { //代码在这里 } 功能条() { //代码在这里 } $functionName=“foo”; //我需要根据$functionName调用函数 是的,有可能: function foo($msg) { echo $msg."<br />"; } $var1 = "foo"; $var1("testing 1,2,3"); 函数foo($msg){ echo$msg.“”; } $var1

我需要能够调用函数,但函数名存储在变量中,这可能吗?e、 g:

函数foo()
{
//代码在这里
}
功能条()
{
//代码在这里
}
$functionName=“foo”;
//我需要根据$functionName调用函数
是的,有可能:

function foo($msg) {
    echo $msg."<br />";
}
$var1 = "foo";
$var1("testing 1,2,3");
函数foo($msg){ echo$msg.“
”; } $var1=“foo”; $var1(“测试1,2,3”);
来源:

使用call\u user\u func函数。

我不知道为什么要使用这个函数,听起来一点也不好,但是如果函数数量很少,可以使用if/elseif构造。 我不知道是否有直接的解决办法

差不多 $foo=“bar”; $test=“foo”; 回声试验


如果返回条,您可以尝试一下,但我认为这对函数不起作用

为了完整性,您还可以使用:


但是,这是正确的方法。

如果其他人被google带到这里,因为他们试图在类中使用变量作为方法,下面是一个实际工作的代码示例。以上这些都不适合我的情况。关键区别在于
&
$c=&new…
&$c
声明中的
&
被传递到
call\u user\u func

我的具体情况是在csscolor.php类中实现与颜色有关的代码和两个成员方法
lighte()
darken()
。无论出于何种原因,我希望相同的代码能够调用light或darken,而不是用逻辑将其选中。这可能是我固执地不使用if-else或更改调用此方法的代码的结果

$lightdark="lighten"; // or optionally can be darken
$color="fcc";   // a hex color
$percent=0.15;  
include_once("csscolor.php");
$c = & new CSS_Color($color);
$rtn=call_user_func( array(&$c,$lightdark),$color,$percent);
请注意,使用
$c->{…}
尝试任何操作都无效。在阅读了php.net页面底部的
call\u user\u func
上读者提供的内容后,我能够将上面的内容拼凑起来。另外,请注意,
$params
作为数组对我来说不起作用

// This doesn't work:
$params=Array($color,$percent);
$rtn=call_user_func( array(&$c,$lightdark),$params);

上述尝试将对需要第二个参数(百分比)的方法发出警告。

如前所述,有几种方法可以实现这一点,最安全的方法可能是
调用用户函数()
,或者如果必须,也可以使用
$function\u name()
。同样,也可以使用这两种方法传递参数

$function_name = 'foobar';

$function_name(arg1, arg2);

call_user_func_array($function_name, array(arg1, arg2));
如果您正在调用的函数属于某个对象,则仍然可以使用以下任一项

$object->$function_name(arg1, arg2);

call_user_func_array(array($object, $function_name), array(arg1, arg2));
但是,如果要使用
$function\u name()
方法,如果名称是动态的,则最好测试函数是否存在

if(method_exists($object, $function_name))
{
    $object->$function_name(arg1, arg2);
}

我最喜欢的版本是内联版本:

${"variableName"} = 12;

$className->{"propertyName"};
$className->{"methodName"}();

StaticClass::${"propertyName"};
StaticClass::{"methodName"}();
您也可以将变量或表达式放在括号内

动态函数名和名称空间 只是想在使用名称空间时添加一点关于动态函数名的内容

如果您使用的是名称空间,除非您的函数位于全局名称空间中,否则以下操作将不起作用:

namespace greetings;

function hello()
{
    // do something
}

$myvar = "hello";
$myvar(); // interpreted as "\hello();"
怎么办? 您必须使用
call\u user\u func()

// if hello() is in the current namespace
call_user_func(__NAMESPACE__.'\\'.$myvar);

// if hello() is in another namespace
call_user_func('mynamespace\\'.$myvar);

补充@Chris K的答案,如果你想调用一个对象的方法,你可以在闭包的帮助下使用单个变量调用它:

function get_method($object, $method){
    return function() use($object, $method){
        $args = func_get_args();
        return call_user_func_array(array($object, $method), $args);           
    };
}

class test{        

    function echo_this($text){
        echo $text;
    }
}

$test = new test();
$echo = get_method($test, 'echo_this');
$echo('Hello');  //Output is "Hello"

我发布了另一个示例

下面的代码可以帮助用PHP编写动态函数。 现在可以通过变量“$current\u page”动态更改函数名

$current_page = 'home_page';
$function = @${$current_page . '_page_versions'};
$function = function() {
    echo 'current page';
};
$function();

几年后,但这是现在最好的方式:

$x = (new ReflectionFunction("foo"))->getClosure();
$x();

我想到的一种非常规方法是,除非您是通过某个超级自治的AI(它自己编写)生成整个代码,否则很有可能您想要“动态”调用的函数已经在您的代码库中定义。那么,为什么不直接检查字符串,跳臭名昭著的
ifelse
舞来召唤……你明白我的意思了

例如

如果您不喜欢
ifelse
ladder的平淡味道,甚至可以使用
switch case

我知道,在某些情况下,“动态调用函数”是绝对必要的(就像一些修改自身的递归逻辑)。但是大多数日常琐碎的用例都可以被回避

它消除了应用程序中的许多不确定性,同时,如果字符串与任何可用函数的定义不匹配,则可以执行回退函数。IMHO.

解决方案:使用PHP7 注:有关摘要版本,请参见TL;答案的最后是DR

旧方法 更新:此处介绍的旧方法之一已被删除。关于其他方法的解释,请参考其他答案,此处不作介绍。顺便说一下,如果这个答案对你没有帮助,你应该返回升级你的东西。PHP5.6支持已于2019年1月结束(现在甚至PHP7.1和7.2都不受支持)。有关更多信息,请参阅

正如其他人提到的,在PHP5(以及像PHP7这样的较新版本)中,我们可以使用变量作为函数名,使用
call\u user\u func()
call\u user\u func\u array()
(我个人讨厌这些函数),等等

新方法 从PHP7开始,引入了新的方法:

注意:括号内的所有内容都表示一个或多个表达式,以构成某个内容,例如,
表示构成函数名的表达式

动态函数调用:动态函数名 我们可以一次性使用括号内的一个或多个表达式作为函数名,形式如下:

()(参数);
例如:

function something():字符串
{
返回“某物”;
}
$bar=“某物”;
(str_replace(“u”,”,$bar))();//某物
//也有可能,;但一般来说,不建议这样做,因为这会使代码更加复杂
(str_替换(“u”,”,$bar));
$x = (new ReflectionFunction("foo"))->getClosure(); $x();
if($functionName == 'foo'){
  foo();
} else if($functionName == 'bar'){
  bar();
}
$functionName1 = "sayHello";
$functionName2 = "sayHelloTo";
$functionName3 = "saySomethingTo";

$friend = "John";
$datas = array(
    "something"=>"how are you?",
    "to"=>"Sarah"
);

function sayHello()
{
echo "Hello!";
}

function sayHelloTo($to)
{
echo "Dear $to, hello!";
}

function saySomethingTo($something, $to)
{
echo "Dear $to, $something";
}
// Calling sayHello()
call_user_func($functionName1); 
// Calling sayHelloTo("John")
call_user_func($functionName2, $friend);
// You can add your arguments
// 1. statically by hard-code, 
$arguments[0] = "how are you?"; // my $something
$arguments[1] = "Sarah"; // my $to

// 2. OR dynamically using foreach
$arguments = NULL;
foreach($datas as $data) 
{
    $arguments[] = $data;
}

// Calling saySomethingTo("how are you?", "Sarah")
call_user_func_array($functionName3, $arguments);
//I want to call method deploy that is stored in functionname 
$functionname = 'deploy';

$retVal = {$functionname}('parameters');
foreach(App\Test::$columns as $name => $column){
        $table->{$column[0]}($name);
}
$this->{$variable}();