Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.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 - Fatal编程技术网

在PHP中,如何调用字符串中的函数?

在PHP中,如何调用字符串中的函数?,php,Php,比方说,字符串是: $str="abcdefg foo() hijklmopqrst"; 如何让php调用foo()并将返回字符串插入该字符串?只需使用以下命令: $foo = foo(); $str = "abcdefg {$foo} hijklmopqrst"; $str = "abcdefg".foo()."hijklmnopqrstuvwxyz"; 它将在字符串创建期间调用函数 $str="abcdefg foo() hijklmopqrst"; function foo() {r

比方说,字符串是:

$str="abcdefg foo() hijklmopqrst";
如何让php调用foo()并将返回字符串插入该字符串?

只需使用以下命令:

$foo = foo();
$str = "abcdefg {$foo} hijklmopqrst";
$str = "abcdefg".foo()."hijklmnopqrstuvwxyz";
它将在字符串创建期间调用函数

$str="abcdefg foo() hijklmopqrst";
function foo() {return "bar";}

$replaced = preg_replace_callback("~([a-z]+)\(\)~", 
     function ($m){
          return $m[1]();
     }, $str);
输出:

$replaced == 'abcdefg bar hijklmopqrst';
这将允许任何小写字母作为函数名。如果需要任何其他符号,请将它们添加到图案中,即
[a-zA-Z!]

非常小心允许调用哪些函数。您至少应该检查$m[1]是否包含不允许远程代码注入攻击的白名单函数

$allowedFunctions = array("foo", "bar" /*, ...*/);

$replaced = preg_replace_callback("~([a-z]+)\(\)~", 
     function ($m) use ($allowedFunctions) {
          if (!in_array($m[1], $allowedFunctions))
              return $m[0]; // Don't replace and maybe add some errors.

          return $m[1]();
     }, $str);
在“abcdefg foo()bat()hijklmopqrst”输出上运行测试
“abcdefg bar bat()hijklmopqrst”

优化白名单方法(根据允许的函数名动态构建模式,即
(foo | bar)


如果要调用某个类的方法,可以使用正态变量展开。例如:

<?php
class thingie {

  public function sayHello() {
    return "hello";
  }

}

$t = new thingie();
echo "thingie says: {$t->sayHello()}";

要从双引号字符串中获取任意表达式,您可以推测变量函数:

<?php
// A user function
function foo() {
    return 'bar';
}

/**
 * The hack
 *
 * @param $v mixed Value
 * return mixed Value (untouched)
 */
$_ = function ( $v ) {
    return $v;
};

// Happy hacking
echo "Foo is {$_( foo() )} and the sum is {$_( 41 + 1 )}...{$_( str_repeat( ' arrh', 3 ) )}!";
参考资料:


这仍然是不可能的,有可用的黑客,但不是我建议坚持使用老式的点运算符,即
$str=“abcdefg”.foo()“hijklmopqrst”;

按照

注:
{$}中的函数、方法调用、静态类变量和类常量自PHP5开始工作。但是,访问的值将被解释为定义字符串的范围内的变量名。使用单个大括号({})不适用于访问函数或方法的返回值或类常量或静态类变量的值


非常令人不快。您是否有一个允许此操作的函数列表,或者有任何函数的列表?(此外,您已经考虑了此操作的安全性和性能影响,是吗?)您可以使用eval()但这不是广泛推荐的。请给我们更多关于您的代码的信息。这个字符串来自哪里?您提到了一个API?这:请不要将已经回答的问题更改为另一个问题。改为打开一个新问题。我必须调用foo()在$str时间内。@lovespring你是说在以后某个时候?也许你在寻找
eval($str)
你想使用什么函数?@lovespring这是一个糟糕的设置。你使用的API是什么?我可以调用,但不能修改其他人的代码,他没有给我API,我必须钩住$str来注入我的代码。但是这样调用全局函数似乎无法包装你想要的全局函数t为了支持方法对象,您可以控制暴露于bug和安全漏洞的足迹。我认为您很难找到更简单的方法来/安全地/提供这样的功能。如果需要,您的包装方法甚至可以执行额外的验证/限制。这是一个很好的“技巧”您甚至可以将参数或其他变量传递给它,即
echo“{$myu-foo('bar')}”
echo“{$myu-foo($bar)}”
——在构建具有多个转义值的SQL查询时尤其有用。如果函数具有参数该怎么办?
function foo()
{
    return 'Hi';
}
$my_foo = 'foo';
echo "{$my_foo()}";
<?php
// A user function
function foo() {
    return 'bar';
}

/**
 * The hack
 *
 * @param $v mixed Value
 * return mixed Value (untouched)
 */
$_ = function ( $v ) {
    return $v;
};

// Happy hacking
echo "Foo is {$_( foo() )} and the sum is {$_( 41 + 1 )}...{$_( str_repeat( ' arrh', 3 ) )}!";
Foo is bar and the sum is 42... arrrh arrrh arrrh!