1

假设我们有功能:

function foo() {
    return "bar";
}

是否可以在函数中添加一些过滤器foo(),例如让它返回双精度值,就像"barbar"不改变函数本身一样。

所以我们会有:

foo(); //returns "bar"
function filter($&val) {
    $val = $val . $val;
}
add_filter_to_function('foo','filter');
foo(); //returns "barbar"

然后在任何使用 foo() 的地方,它都会返回过滤后的值,而无需更改调用foo()类似代码的代码,foo() . foo()也无需更改函数本身

4

4 回答 4

2

在 PHP 中,有一个RunKit扩展(runkit_function_redefine()特别针对您的问题),它允许您动态操作代码的对象(例如函数或类)。

但是我认为如果您需要以这种方式更改函数的代码,那么您做错了 - 所以您可能应该重新考虑您的目标并使用其他工具解决您最初的问题。

如果您需要在某些特殊情况下使用某些参数调用您的函数,您可以使用类似:

function foo($x, $y)
{
   //do stuff
}

function bar($x, $y, $z)
{
   //do stuff with $z?
   foo($x, $y);
}

并在某些地方使用bar()而不是foo()then - 在某些地方(您需要调整)

于 2013-09-11T12:13:44.210 回答
0

您可以简单地将值连接到自身:

$val = foo();
$val .= $val;

或者如果您的函数确实需要返回一个双精度值,那么您可能应该考虑重构您的foo()函数,因为它似乎并没有按照您的意愿行事。要么,要么接受告诉您foo()环绕另一个功能的其他答案之一。

于 2013-09-11T12:11:48.083 回答
0

如果函数是静态的,则不能在内部更改函数的返回值。

如果您有foo($var),您可以更改 $var 的状态,并且最近每次调用 foo($var) 时,您都会收到新值,但在您的情况下,这几乎是不可能的。

每次需要双值时都必须调用另一个函数:

function foo() {
    return 'bar';
}
function filter($func) {
    return $func.$func;
}
echo filter(foo());
于 2013-09-11T12:12:27.970 回答
0

将您的函数转换为对象方法,然后 add_filter_to_function 会将过滤器添加到对象中。

然后,当您调用该函数时,它将能够使用已分配给该函数所属对象的过滤器。

于 2013-09-11T12:12:41.757 回答