【问题标题】:PHP function scope [duplicate]PHP函数范围[重复]
【发布时间】:2011-08-22 18:19:42
【问题描述】:

我知道这是我在这里尝试的一种 hacky 事情,但我想知道这是否可能。无论如何我可以在以下代码中访问$x 变量,而无需传递参数?

function foo() {
 $x = 1;
 return bar();
}

function bar() {
  //get $x from foo here somehow?
  return $x ? 'stuff' : 'other stuff';
}

【问题讨论】:

  • 关于提出问题的日期,我实际上认为 other 问题与此问题重复。

标签: php


【解决方案1】:

我知道这有点老了,答案已经被接受了,但这不可行吗?

function foo() 
  {  
    $x = 1;  
    return bar($x); 
  }  

function bar($x) 
  {
    return $x ? 'stuff' : 'other stuff'; 
  } 

【讨论】:

  • 正如我在问题中所说,它必须不接受 agruments,因为我无法更改 bar() 函数的签名。所以不,这在这种情况下不起作用。
  • 对不起,我忽略了那部分。我是否正确理解您根本无法编辑 bar() ?如果可以,那么您可以使用 func_get_args 来允许您传入另一个值。
【解决方案2】:
class baz {
   private $x;
   public function foo() {
      $this->x = 1;
      return $this->bar();
   }

   public function bar() {
      return $this->x ? 'stuff' : 'other stuff';
   }
}

【讨论】:

    【解决方案3】:

    我不知道为什么,但你可以使用全局变量来打开整个事物,但我会告诉你:

    function foo() {
     global $x;
     $x = 1;
     return bar();
    }
    
    function bar() {
      global $x;
      //get $x from foo here somehow?
      return $x ? 'stuff' : 'other stuff';
    }
    

    这里是演示:http://codepad.org/fPqUXzyC

    最好不要使用全局变量而只传递参数,但如果你不能使用全局变量

    【讨论】:

    • 我同意,如果您在全局范围内使用变量而不...在对象或类似的东西中以某种方式限定它们,代码最终变得更难管理并且更容易出现许多依赖问题。
    • 我怀疑 OP 知道如何使用全局变量,但正在寻找 uplevel 类型的功能。
    • @webbiedave,这是什么意思?不要suspect 什么,你怎么知道?
    • 这个“有效”的原因是因为 PHP 会创建不存在的变量。 global 语句在全局范围内创建 $x
    • @Neal:我不知道。我只是怀疑它,因为他已经是多语言的程序员,上过计算机科学课程,并表示他正在尝试做一些“hacky”的事情。另外,请在此处查看他的答案:stackoverflow.com/questions/1909647/… 和此处stackoverflow.com/questions/2067251/…
    【解决方案4】:

    您可以让foo()$x 值存储到$GLOBALS[]global $x;。除此之外,没有什么我能想到的。需要有目的地公开它才能从另一个函数中获取它。

    如果这是您的代码,我建议您考虑采用面向对象的方法。

    class Foo
    {
      public static $x;
    
      public static function Foo(){
        Foo::$x = 1;
        return Foo::Bar();
      }
    
      public static function Bar() {
        return Foo::$x ? 'stuff' : 'other stuff';
      }
    }
    
    echo Foo::Foo();
    

    或者,按照其他人的建议进行操作,并将$x 作为函数参数传递。

    【讨论】:

      猜你喜欢
      • 2011-11-19
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 2021-11-25
      • 2015-12-20
      • 2012-08-03
      • 1970-01-01
      • 2017-05-17
      相关资源
      最近更新 更多