想象一下
aFunction() {
$foo = 123;
// a lot more code
}
aFunction();
echo $foo; // undefined
有没有办法将函数的过程放入调用者的范围?
答案 0 :(得分:2)
没有
为了从中获取价值,您必须使用以下其中一项:
答案 1 :(得分:1)
不,这是不可能的。
你可以把一些非常难看的东西与get_defined_vars
和extract
放在一起,但即使这样也只会给你价值,而不是实际的变量。
如有必要,请尝试使用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开发人员真正知道什么是闭包,所以他们不是很受欢迎也就不足为奇了。