【问题标题】:how to use a variable created in local scope "without assigning" in global如何使用在局部范围内创建的变量“不分配”在全局
【发布时间】:2012-04-24 13:31:55
【问题描述】:

我正在尝试使用在本地范围内创建的变量,而不在全局范围内分配该变量。看看我的意思:

<?
function foo(){
    $bar = inside;
}
foo();
echo $bar; // It will give an error that $bar is not assigned
?>

现在您可能已经明白我在尝试什么了..?是的,我想回显该 $bar 而不在全局范围内分配它。

一些编码示例很受欢迎。

提前致谢

【问题讨论】:

  • 您要的是没有全局变量的全局变量,这显然是不可能的。有更好的方法来做你想做的事;告诉我们它是什么。
  • 我正在尝试制作一个使 SQL 查询更容易的函数,它在 $result(local) 中返回查询结果。我想在运行函数后将该 $result 分配给另一个变量(全局)
  • 不要这样做。你的代码会很糟糕。按照昆汀的建议去做,即使不是你要求的。
  • 这正是 $http_response_header 的工作原理——太糟糕了,想出这个的人没有得到“不要这样做”的建议 :)

标签: php function scope global local


【解决方案1】:

使用返回值。

<?php
function foo(){
    $bar = "inside";
    return $bar;
}
$bar = foo();
echo $bar;
?>

【讨论】:

  • 我告诉过我想使用 $bar 而不分配。你为 $bar 分配了一个函数,这不是我需要的。
  • @yusufiqbalpk — 这可能是你想说的,但它含糊不清,可以解释。我以为您的意思是“不使用the global keyword”。如果数据不存在于您想要使用的范围内,您就无法使用它。那将是不合逻辑的,而逻辑是编程的核心。
  • 请告诉我有关 Brad Christie 的回答。有什么不合逻辑的吗?
  • @yusufiqbalpk — 它将它分配给一个全局超变量(它在所有东西的范围内),所以它不是不合逻辑的。这只是一种导致代码难以维护的做法。
【解决方案2】:

唯一可能的方法是使用$GLOBALS 超级全局(至少不返回它):

function foo(){
  $GLOBALS['bar'] = 'baz';
}

foo();
echo $bar;

否则,您首先要在全局范围内定义它,然后使用global 指定您需要访问它:

$bar = null;

function foo(){
  global $bar;

  $bar = 'baz';
}

foo();
echo $bar;

更好的选择是使用范围保留在对象内的对象,并且您仍然可以保留代码的结构和完整性:

class Foo
{
  var $bar = null;

  function Bar()
  {
    $this->bar = 'baz';
  }
}

$foo = new Foo();
$foo->Bar();
echo $foo->bar;

【讨论】:

  • 呃...这是 “没有在全局中分配该变量”
  • 这正是 OP 不想做的事情。
  • @Jon/Deleteman:是的,它是在全局范围内定义的,但是定义一个变量只是为了为其分配一个函数的返回值(你认为 $bar 在 Quentin's例子?)。你必须在某个时候在那里定义它。这是一个正在缓解的“预定义”问题。
  • 第一个例子是完美的,这就是我想要的。谢谢布拉德
【解决方案3】:

如果您想从外部访问局部变量的内容,您有 3 个选项:

使用全局变量:通常不推荐,也不是您想要的。

返回那个变量的值:

<?
function foo(){
    $bar = inside;
}
$outisde_bar = foo();
echo $outside_bar;
?>

使用引用的变量作为函数的属性:

<?
function foo(&$bar){
    $bar = inside;
}
foo($bar);
echo $bar;
?>

这有帮助吗?

【讨论】:

  • 而且我肯定在此示例中,$outside_bar$bar 均未在全局范围内定义,而在我的示例中,它们显然是...
  • 在第三个示例中,&amp;amp; 应该只是 &amp;,但 SO 正在更改它。
  • @yusufiqbalpk 修复了示例,这样您就不会避免使用全局变量。
猜你喜欢
  • 2017-03-05
  • 2013-12-25
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-13
  • 2019-09-28
相关资源
最近更新 更多