我在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
...
}
现在这可以很好,但在我的previous question on SO中,我被告知访问全局变量是一种不好的做法,就像我正在做的那样上课。所以,我试图通过以下方式在构造函数中传递全局变量:
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的拼写错误。在这里打字只是错误,错误不是因为这个。
答案 0 :(得分:3)
嗯......在你的构造函数中使用global
可以胜任这一点。考虑将其作为参数__construct($mysqli)
传递。
public function __construct($mysqli)
{
$this->mysqli = $mysqli;
}
您在这里尝试做的是dependency injection。
答案 1 :(得分:1)
我认为问题是您错误输入__construct
尝试将__cuntruct
更改为构造函数的正确名称。
username_exists中的全局也没用。
您还应该编写一个构造函数,该构造函数将变量作为参数并避免使用全局completly:
class User {
var $mysqli;
function __construct($mysqli) {
$this->mysqli = $mysqli;
}
[ ... some functions ... ]
}
您必须像这样创建对象:
$myuser = new User($mysqli);
$myUser->prepare();
答案 2 :(得分:1)
您的构造函数未被调用,因为它不是构造函数
__cuntruct
应该是
__construct
答案 3 :(得分:1)
所写的代码并不是SO上其他人试图鼓励你做的事情。
function __construct($mysql_handler){
$this->mysql = $mysql_handler;
}
这是在构造中将参数传递到对象范围。当您创建对象的实例时,您将传入mysql句柄。
$mysqli = new mysqli("localhost", "user", "pass", "db");
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$u = new User($mysqlli);
然后你应该能够在属性本身上调用mysqlli成员函数。
你的构造函数也拼写错误。它只能与魔术方法名称__construct()一起正常工作。
答案 4 :(得分:1)
一些事情。如果您将__cuntruct
更改为__construct
,我认为可行。
您仍然在global
函数中使用username_exists
声明。为什么不在构造函数中传递$mysqli
变量?
function _construct($mysqli) {
$this->mysqli = $mysqli;
}
然后你在课堂上没有全局变种。
答案 5 :(得分:-1)
删除函数global $mysqli;
中的username_exists()
,这没有用。
global $mysqli;
不是必需的/没有意义,因为您希望此变量将引用存储在对象的上下文中。
答案 6 :(得分:-1)
将__cuntruct()
更改为__construct()