如何访问常量定义的外部类?

时间:2010-06-11 15:10:03

标签: php class constants global

我定义了一些常量,例如:

define('DB_HOSTNAME', 'localhost', true);
define('DB_USERNAME', 'root', true);
define('DB_PASSWORD', 'root', true);
define('DB_DATABASE', 'authtest', true);

现在当我尝试这样做时:

class Auth{
function AuthClass() {
$this->db_link = mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD) 
or die(mysql_error());
}
}

我收到错误。 为什么这是我需要做什么?

请参阅,我已尝试使用(例如)global DB_HOSTNAME,但此操作失败并显示错误。

我得到的错误是:

  

未知的MySQL服务器主机'DB_HOSTNAME'(1)

3 个答案:

答案 0 :(得分:11)

当脚本运行时,应该包括常量和类定义。

e.g。

constants.php.inc

define('DB_HOSTNAME', 'localhost', true);
define('DB_USERNAME', 'root', true);
define('DB_PASSWORD', 'root', true);
define('DB_DATABASE', 'authtest', true);

Auth.php.inc

class Auth{
    function AuthClass() {
        $this->db_link = mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD) 
           or die(mysql_error());
    }
}

的script.php

include "constants.php.inc";
include "Auth.php.inc";

//do stuff

答案 1 :(得分:2)

只要您在AuthClass()运行之前定义了常量,它就应该有效。如果它们与Auth类不在同一个文件中,您首先需要将它们包含在Auth所在的文件中,以便它们可以看到它们:

include("the_file_that_has_those_constants_in_it.php");

然后它应该工作。常量已经是全局的,因此无需使用global关键字。

答案 2 :(得分:1)

在实例化类Auth之前,听起来好像没有定义常量。当您以这种方式使用未定义的常量时,PHP将发出警告并将其转换为字符串。如果问题确实是未定义常量,则代码将被有效地解释为:

$this->db_link = mysql_connect('DB_HOSTNAME', 'DB_USERNAME', 'DB_PASSWORD');

鉴于你得到的错误(未知的MySQL服务器主机'DB_HOSTNAME'),我假设这就是正在发生的事情。

正如其他答案所述,请确保在尝试呼叫Auth::AuthClass之前定义常量。如果类和DB_ *常量在不同的文件中定义,请确保在尝试实例化/使用类Auth之前包含这两个文件。


另外,定义的常量是不是变量。您不能以这种方式使用global CONSTANT_NAME;,并且您不需要 - 所有常量始终是全局的,并且在定义它们之后的任何地方都可用。一个简单的测试证明了这一点:

define ('MY_CONST', 3);

class Test {
    function __construct() { echo MY_CONST; }
}

$x = new Test(); // outputs 3