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的拼写错误。这里输入的只是错误,而错误不是因为这个。

+0

为什么ü写'专用$ mysqli的;'最后的代码块 – diEcho 2011-03-07 13:09:10

我认为这个问题是你misstyped __construct试着改变你的__cuntruct为构造正确的名称。

username_exists中的global也是无用的。

你也应该写一个构造函数,采用变量作为参数,避免使用全局完全地:

class User { 
    var $mysqli; 

    function __construct($mysqli) { 
     $this->mysqli = $mysqli; 
    } 

    [ ... some functions ... ] 
} 

你必须创建你的对象是这样的:

$myuser = new User($mysqli); 
$myUser->prepare(); 
+0

感谢您的答复。对不起,我输错了构造,但那不是问题。我试着用你描述的方法,我得到2个错误,第一个警告:'缺少用户:: __构造()的参数1,在......中调用,第二个错误与我在原始文章中提到的相同。你能看看我的原始文件中的配置文件的代码。再次感谢。 – Jay 2011-03-07 16:23:53

+0

当您创建对象时,您必须传递您的$ 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()

+1

上应该是'__construct' – bradenkeith 2011-03-07 13:12:07

你的构造是没有得到所谓的因为它根本不是构造函数

__cuntruct 

应该是

__construct 
+0

为什么downvote ...我真的想知道我错在哪里 – 2011-03-07 13:20:57

+0

可能有人试图取消我的upvote,所以他们的答案等级更高...你的答案是正确的,并且是最快的。 – bradenkeith 2011-03-07 13:24:18

+1

我正面临着这个问题,有人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; 
} 

,那么你必须在类中没有全局。

+0

感谢您的答复,但拼写错误只是在这里打字,对不起。我已经解决了这个问题,并且还试图在构造函数中传递变量,它仍然会给出相同的错误。如果你看到我的配置文件代码在上面,我需要改变什么吗?谢谢。 – Jay 2011-03-07 14:04:39