【问题标题】:Cannot access global variable from within class constructor无法从类构造函数中访问全局变量
【发布时间】:2017-05-18 06:09:34
【问题描述】:

好的,所以我试图简单地检查数组内部是否有来自构造的东西,但它似乎根本不起作用......

    $DB_VALID = array("mysql");

    class DB {
        function __construct($conn) {
            if(in_array($conn,$DB_VALID)) {
                echo "exists!";
            }
            else {
                echo "doesnt exist";
            }
        }
    }

现在,由于构造在一个类中,如果我转储它,我会得到 NULL 的结果,但如果我将它转储到构造之外,我只会得到真正的结果......

用法

$conn = new DB("mysql");

结果? in_array 返回 false

【问题讨论】:

标签: php


【解决方案1】:

变量$DB_VALID 不存在于__construction 函数范围内。

推荐的解决方案是将$DB_VALID 移动到DB 类中的静态变量中,如下所示:

class DB {
    static $DB_VALID = array("mysql");

    function __construct($conn) {
        if(in_array($conn,self::$DB_VALID)) {
            echo "exists!";
        }
        else {
            echo "doesnt exist";
        }
    }
}

您可以稍后在代码的其他部分通过将其引用为 DB::$DB_VALID 来访问该数组。

但是,如果您必须保留全局变量并从 __construct 中访问它,您可以使用 global 关键字将其带入本地范围,如下所示:

$DB_VALID = array("mysql");

class DB {
    function __construct($conn) {
        global $DB_VALID; // Brings the global variable to local scope
        if(in_array($conn,$DB_VALID)) {
            echo "exists!";
        }
        else {
            echo "doesnt exist";
        }
    }
}

不过,请考虑未来的第一个解决方案,因为使用全局变量是让您的应用程序随着它们的发展而中断的一种简单方法。

编辑:正如您在 cmets 中提到的,您的限制是您现在加载脚本的顺序,您还应该真正研究类自动加载和命名空间,因为您的项目将变得越来越复杂且难以管理(请参阅sitepoint.com/autoloading-and-the-psr-0-standard)。

【讨论】:

  • 但是有没有其他方法可以让我在范围之外拥有它?使其成为全球性的方式或类似的方式。我不希望它出现在课程本身这是主要问题
  • 抱歉,刚刚进行了编辑以清除该问题。您可以在代码的其他地方使用DB::$DB_VALID 来引用它(只要预先包含或自动加载了该类)。
  • 问题是,我正在使用一个单独的 php 文件来包含该数组(当然还有许多其他的东西),因此目前在类本身中使用它有点不可能,我真的想把它放在外面
  • 您应该真正研究类自动加载和命名空间,否则您的项目将变得越来越复杂且难以管理(请参阅sitepoint.com/autoloading-and-the-psr-0-standard)。但是,您可以通过在 __construct 中添加 global $DB_VALID 来快速修复您的情况,以便将全局变量导入函数范围。我应该警告你,这真的不推荐,而且违背了最佳实践。
  • 你将“mysql”解析到类中,你可以对数组$conn = new DB("mysql",$DB_VALID);做同样的事情
【解决方案2】:

如果您,请使用global 关键字。

$DB_VALID = array("mysql");

class DB {
    function __construct($conn) {
        global $DB_VALID; // Makes the variable available in the scope
        if(in_array($conn,$DB_VALID)) {
            echo "exists!";
        }
        else {
            echo "doesnt exist";
        }
    }
}

$conn = new DB("mysql"); // will print "exists!"

请注意,全局变量通常会提示 organisation problems,因此您可能应该检查您的结构,看看是否真的有必要在此处使用 global

【讨论】:

  • 强烈建议不要使用全局
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
相关资源
最近更新 更多