无法从类构造函数中访问全局变量

时间:2017-01-04 02:59:11

标签: php

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

    $DB_VALID = array("mysql");

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

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

用法

$conn = new DB("mysql");

结果? in_array返回false

2 个答案:

答案 0 :(得分:2)

$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";
        }
    }
}

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

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

答案 1 :(得分:0)

如果 ,请使用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