我定义了一些常量,例如:
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)
答案 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