【问题标题】:Access global variable from within a class从类中访问全局变量
【发布时间】:2009-12-09 21:46:43
【问题描述】:

我有以下(精简)代码:

<?PHP
    class A {
        function Show(){
            echo "ciao";
        }
    }

    $a = new A();
    $b = new B();

    class B {
        function __construct() {
            $a->Show();
        }
    }
?>

有点惊讶的是,我无法从类中访问全局定义的 $a 变量,我得到了一个 Undefined variable 异常。有什么帮助吗?

【问题讨论】:

    标签: php


    【解决方案1】:

    请不要使用建议的全局方法。这让我胃痛。

    将 $a 传递给 B 的构造函数。

    class A {
        function Show(){
                echo "ciao";
        }
    }
    
    $a = new A();
    $b = new B( $a );
    
    class B {
        function __construct( $a ) {
            $a->Show();
        }
    }
    

    【讨论】:

    • 在这个例子中,为什么 B 不扩展 A?
    • @roberthuttinger - 这完全取决于两个类之间的关系。
    • @robertthuttinger:扩展 Galen 所说的……因为您可能不希望 B 继承 A 的所有方法。在这个特定的实例中,这样会产生相同的结果,但是如果您向 A 添加一个构造函数方法,该方法与 B 的不期望值相呼应怎么办?根据对象的复杂性,它可能会造成更大的混乱。
    【解决方案2】:

    为什么会有惊喜?这是一个非常合乎逻辑的变量范围问题......

    我建议您使用global 关键字或变量$GLOBALS 来访问您的变量。

    编辑:所以,在你的情况下,这将是:

    global $a;
    $a->Show();
    

    $GLOBALS['a']->Show();
    

    编辑 2: 而且,既然 Vinko 是对的,我建议你看一下关于 variable scope 的 PHP 手册。

    【讨论】:

    • 对于习惯于隐式继承范围的语言(如 C)的人来说,这是令人惊讶的。
    【解决方案3】:

    您需要在要使用它的函数范围内将其定义为global variable

    function __construct() {
        global $a;
        $a->Show();
    }
    

    【讨论】:

      【解决方案4】:
      <?php
      class A {
          public function Show(){
            return "ciao";
          }
      }
      
      class B {
          function __construct() {
              $a = new A();
              echo $a->Show();
          }
      }
      
      $b = new B();
      ?>
      

      【讨论】:

        猜你喜欢
        • 2011-10-29
        • 1970-01-01
        • 1970-01-01
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多