从函数返回变量

时间:2011-11-06 15:24:42

标签: php

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

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

以某种方式可以通过调用函数来访问$ a吗?试验();

不是$ a = test();

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

4 个答案:

答案 0 :(得分:1)

您必须将变量放入全局范围:

http://codepad.org/PzKxWGbU

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保存在一个变量中,如果不是你可以只显示它调用测试函数。

希望它有所帮助。

尼古拉。