我对PHP中的全局变量有问题。我有mysqli配置文件,它只包含以下数据:
$mysqli = new mysqli("localhost", "user", "pass", "db");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}我在另一个文件上有以下类:
class user{
function username_exists($username){
global $mysqli;
if ($stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?")) {
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->store_result();
$count=$stmt->num_rows;
$stmt->close();
}
return ($count > 0 ? true : false);
}
...
some more functions
...
}现在,这可以使用精细,但是在我的先前的问题中,我被告知访问全局变量是一种糟糕的做法,就像我在上面的类中所做的那样。因此,我试图以以下方式在构造函数中传递全局变量:
private $mysqli;
function __construct()
{
global $mysqli;
$this->mysqli = $mysqli;
}
function username_exists($username){
//global $mysqli;
if ($stmt = $this->mysqli->prepare("SELECT username FROM users WHERE username=?")) {我得到以下错误
Fatal error: Call to a member function prepare() on a non-object in...(line number)你能告诉我它有什么问题吗?如何解决?谢谢。编辑:对不起,__construct的拼写错误。在这里输入只是错误,错误并不是因为这一点。
发布于 2011-03-07 13:11:43
我认为问题在于您错误输入了__construct,尝试将__cuntruct更改为构造函数的正确名称。
username_exists中的全局也是无用的。
您还应该编写一个构造函数,该构造函数以变量为参数,避免完全使用全局:
class User {
var $mysqli;
function __construct($mysqli) {
$this->mysqli = $mysqli;
}
[ ... some functions ... ]
}您必须像这样创建对象:
$myuser = new User($mysqli);
$myUser->prepare();发布于 2011-03-07 13:10:27
好吧..。在构造函数类型中使用global比这一点更重要。考虑将其作为参数__construct($mysqli)传入。
public function __construct($mysqli)
{
$this->mysqli = $mysqli;
}你在这里试图做的事情叫做依赖注入。
发布于 2011-03-07 13:12:07
您的构造函数没有被调用,因为它根本不是构造函数。
__cuntruct应该是
__constructhttps://stackoverflow.com/questions/5220096
复制相似问题