PHP访问全局变量的问题
我在PHP中遇到全局变量问题。我只包含以下数据mysqli的配置文件:PHP访问全局变量的问题
$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的拼写错误。这里输入的只是错误,而错误不是因为这个。
我认为这个问题是你misstyped __construct
试着改变你的__cuntruct
为构造正确的名称。
username_exists中的global也是无用的。
你也应该写一个构造函数,采用变量作为参数,避免使用全局完全地:
class User {
var $mysqli;
function __construct($mysqli) {
$this->mysqli = $mysqli;
}
[ ... some functions ... ]
}
你必须创建你的对象是这样的:
$myuser = new User($mysqli);
$myUser->prepare();
感谢您的答复。对不起,我输错了构造,但那不是问题。我试着用你描述的方法,我得到2个错误,第一个警告:'缺少用户:: __构造()的参数1,在......中调用,第二个错误与我在原始文章中提到的相同。你能看看我的原始文件中的配置文件的代码。再次感谢。 – Jay 2011-03-07 16:23:53
当您创建对象时,您必须传递您的$ mysqli变量。我想你应该阅读有关对象的PHP文档:http://php.net/manual/en/language.oop5.basic.php在我看来,你并不真正了解你在做什么。顺便说一句,我更新了我的帖子,关于如何创建对象 – krtek 2011-03-07 16:29:17
删除功能username_exists()
中的global $mysqli;
,这没有任何意义。
global $mysqli;
不是必需的/没有意义,因为您希望此变量存储引用连接的对象的上下文中。
呃......在你的构造函数中有global
有点胜利。考虑通过它作为参数__construct($mysqli)
。
public function __construct($mysqli)
{
$this->mysqli = $mysqli;
}
你想在这里做什么叫做dependency injection。
你的构造是没有得到所谓的因为它根本不是构造函数
__cuntruct
应该是
__construct
为什么downvote ...我真的想知道我错在哪里 – 2011-03-07 13:20:57
可能有人试图取消我的upvote,所以他们的答案等级更高...你的答案是正确的,并且是最快的。 – bradenkeith 2011-03-07 13:24:18
我正面临着这个问题,有人downvote并没有回应他为什么这样做? Downvote,这是好的,但要小心留下评论 – 2011-03-07 13:31:50
书面真的没有什么上,因此其他人试图鼓励你做的代码。
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()正常工作。
夫妇的事情。如果您将__cuntruct
更改为__construct
,我认为它可以正常工作。
你还在使用username_exists
函数内global
声明。为什么不在构造函数中传递$mysqli
变量?
function _construct($mysqli) {
$this->mysqli = $mysqli;
}
,那么你必须在类中没有全局。
感谢您的答复,但拼写错误只是在这里打字,对不起。我已经解决了这个问题,并且还试图在构造函数中传递变量,它仍然会给出相同的错误。如果你看到我的配置文件代码在上面,我需要改变什么吗?谢谢。 – Jay 2011-03-07 14:04:39
为什么ü写'专用$ mysqli的;'最后的代码块 – diEcho 2011-03-07 13:09:10