是否可以在调用者的范围内执行函数的过程?

时间:2010-01-01 00:00:18

标签: php

想象一下

aFunction() {
    $foo = 123;
    // a lot more code
}

aFunction();
echo $foo; // undefined

有没有办法将函数的过程放入调用者的范围?

5 个答案:

答案 0 :(得分:2)

没有

为了从中获取价值,您必须使用以下其中一项:

  1. 让aFunction返回值
  2. 通过引用将值传递给aFunction
  3. 使用全局

答案 1 :(得分:1)

不,这是不可能的。

你可以把一些非常难看的东西与get_defined_varsextract放在一起,但即使这样也只会给你价值,而不是实际的变量。

如有必要,请尝试使用global。大多数情况下,可以更清洁的方式达到预期目标。

答案 2 :(得分:0)

您可以使用global

aFunction() {
    global $foo, $bar, $etc;
    $foo = 123;
    $bar = 456;
    $etc = 789;
    // a lot more code
}

aFunction();
echo $foo . $bar . $etc; // 123456789

aFunction() {
    $foo = 123;
    // a lot more code
    return $foo;
}

echo aFunction(); // 123

答案 3 :(得分:0)

可以使用全局变量,但我会说这是一个非常糟糕的主意。有几种方法可以做到这一点:

您可以获取aFunction

的返回值
function aFunction() {

    return 'hello!';

}

$foo = aFunction();
echo $foo; // output: hello!

或通过引用传递$foo并让aFunction处理其值:

function aFunction(&$foo) {

    $foo = 'hello!';

}

$foo = '';
aFunction($foo);
echo $foo; // output: hello!

我猜测,因为你只想在调用范围中使用变量,所以返回值解决方案不合理,因为它们有很多。在这种情况下,参考思想是有效的,但更好的解决方案是将所需的变量包装在一个类中:

class Foo {

    public $foo;
    public $bar;
    public $baz;

}

function aFunction(Foo $foo) {

    $foo->foo = 'hello';
    $foo->bar = 'there';
    $foo->baz = 'mate';

    return $foo;

}

$foo = new Foo;
$foo = aFunction($foo);
echo "{$foo->foo} {$foo->bar} {$foo->baz}"; // output: hello there mate

这样,您也可以在其他函数中使用该类,并将这些变量逻辑分组在一起。更好的做法是通过类方法修改和获取这些变量,以防您在设置/返回变量之前需要对变量执行某种处理。你也可以在类中使用pass-by-reference方法,但最好尽可能坚持返回值,因为变量在传递给函数时会被修改,这可能会产生意想不到的副作用。

这也减少了你的功能参数的数量,这把非常糟糕的想法变成了一件大事。

答案 4 :(得分:0)

PHP 5.3似乎支持闭包。

http://www.ibm.com/developerworks/opensource/library/os-php-5.3new2/index.html

你不会发现很多PHP开发人员真正知道什么是闭包,所以他们不是很受欢迎也就不足为奇了。