PHP访问全局变量时出错

时间:2011-03-07 13:06:41

标签: php mysqli

我在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的拼写错误。在这里打字只是错误,错误不是因为这个。

7 个答案:

答案 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()