这可能不是最明智的问题,但是可以从函数返回变量而不重新声明它吗?
function test(){
$a = 1;
return $a;
}
以某种方式可以通过调用函数来访问$ a吗?试验();
不是$ a = test();
这是唯一的方法吗?我想在调用函数后使$ a可用。
答案 0 :(得分:1)
您必须将变量放入全局范围:
function test()
{
$GLOBALS['a'] = 'Hello World!';
}
test();
echo $a;
但最好使用返回值或引用:
function test(&$ref)
{
$ref = 'Hello World!';
}
$var = '';
test($var);
答案 1 :(得分:1)
我假设您在调用函数时想要更改某些上下文。
这是可能的。例如,所有全局变量在您的应用程序中共享相同的上下文。如果函数集为global variable,则其在全局范围内可用:
function change_global_variable($name, $value)
{
$GLOBALS[$name] = $value;
}
change_global_variable('a', 1);
echo $a;
但是,每当您执行此类操作时,请注意您正在破坏代码的模块化。例如,如果您有50个这样的函数和80个变量,然后您需要更改某些内容,则需要更改许多地方。更难的是,你不记得你需要改变哪些地方以及它们如何彼此属于。
通常最好将上下文作为对象并将其传递给更改它的函数,因此更清楚函数的作用:
class Context extends ArrayObject {}
$context = new Context;
function change_context(Context $context, $name, $value)
{
$context[$name] = $value;
}
change_context($context, 'b', 2);
echo $context['b'], "\n";
此示例演示了一些名为依赖注入的内容。您不是要修改PHP中存在的唯一一个(全局)上下文,而是告诉函数它应该修改什么,而不是修改硬编码的全局变量
有一种混合形式,使用全局变量范围来包含上下文,因此您可以将其作为附加参数传递,但是我只是为了完整性而在此处显示它,因为它无助于保持模块性(但它比使用多个全局变量更好):
class Context extends ArrayObject {}
$context = new Context;
function change_global_context($name, $value)
{
global $context;
$context[$name] = $value;
}
change_global_context('c', 3);
echo $context['c'], "\n";
经验法则:避免全局变量。考虑到它们非常昂贵,并且您不希望代码昂贵。
答案 2 :(得分:0)
不,这不是由于范围界定。
一个选项是先声明$ a然后再将其设为全局。然后它将在测试中可用:
$a = '';
function test(){
global $a;
$a = 1;
return $a;
}
echo $a; // 1
但我可以问你为什么要这样做?你是在玩游戏还是有用例?如果你需要的话,你最有可能做错了。
答案 3 :(得分:-1)
也许如果你只是想展示你可以使用的变量
function test(){
$a = 1;
echo $a;
return $a;
}
以这种方式,如果你想要你可以将变量$ a保存在一个变量中,如果不是你可以只显示它调用测试函数。
希望它有所帮助。
尼古拉。