2011-11-06 121 views
0

这可能不是最明智的问题,但是是否可以从函数返回变量而不重新声明它?从函数返回变量

function test(){ 
$a = 1; 
return $a; 
} 

难道只要调用该函数就可以访问$ a吗?测试();

not $ a = test();

这是唯一的方法吗?我想在调用函数后使$ a可用。

+0

你是什么原因?只是一时兴起? –

+0

只是有兴趣知道。我有大约30页调用一个函数,返回这些页面使用的变量。我想我可以节省一些时间。 – domino

+0

节省什么时间?输入'$ var ='?我的天啊。你问这个问题已经十次了。并且使你的代码变得更糟。 –

回答

1

你必须把变量到全局范围:

http://codepad.org/PzKxWGbU

function test() 
{ 
    $GLOBALS['a'] = 'Hello World!'; 
} 
test(); 
echo $a; 

但它会更好地使用返回值或引用:

function test(&$ref) 
{ 
    $ref = 'Hello World!'; 
} 
$var = ''; 
test($var); 
+0

你为什么低调? – ComFreek

+0

我没有,谢谢。 – domino

0

不,不是由于范围界定。

一个选项是先声明$ a然后使其成为全局的。然后它将在测试中可用:

$a = ''; 

function test(){ 
    global $a; 
    $a = 1; 
    return $a; 
} 

echo $a; // 1 

但是我可以问你为什么要这样做吗?你只是在玩游戏吗?或者你有用例吗?如果你需要这个,你很可能做错了。

+0

我正在重新编码一个脚本。大多数页面使用之前全局定义的变量。我做了一个会话检查函数,在用户登录的情况下返回相同的变量。我想我会节省一些时间。 – domino

-1

也许如果你只是想显示的变量,你可以以这种方式使用

function test(){ 
    $a = 1; 
    echo $a; 
    return $a; 
} 

,如果你愿意,你可以保存变量$ a的变量,如果没有你可以只显示它调用测试功能。

希望它有帮助。

Nicola。

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"; 

经验法则:避免全局变量。考虑到它们非常昂贵,你不希望你的代码很昂贵。