首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问全局变量的PHP问题

问访问全局变量的PHP问题
EN

Stack Overflow用户
提问于 2011-03-07 13:06:41
回答 7查看 1.7K关注 0票数 1

我对PHP中的全局变量有问题。我有mysqli配置文件,它只包含以下数据:

代码语言:javascript
复制
$mysqli = new mysqli("localhost", "user", "pass", "db");
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

我在另一个文件上有以下类:

代码语言:javascript
复制
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
    ...

    }

现在,这可以使用精细,但是在我的先前的问题中,我被告知访问全局变量是一种糟糕的做法,就像我在上面的类中所做的那样。因此,我试图以以下方式在构造函数中传递全局变量:

代码语言:javascript
复制
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=?")) {

我得到以下错误

代码语言:javascript
复制
Fatal error: Call to a member function prepare() on a non-object in...(line number)

你能告诉我它有什么问题吗?如何解决?谢谢。编辑:对不起,__construct的拼写错误。在这里输入只是错误,错误并不是因为这一点。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-03-07 13:11:43

我认为问题在于您错误输入了__construct,尝试将__cuntruct更改为构造函数的正确名称。

username_exists中的全局也是无用的。

您还应该编写一个构造函数,该构造函数以变量为参数,避免完全使用全局:

代码语言:javascript
复制
class User {
     var $mysqli;

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

     [ ... some functions ... ]
}

您必须像这样创建对象:

代码语言:javascript
复制
$myuser = new User($mysqli);
$myUser->prepare();
票数 1
EN

Stack Overflow用户

发布于 2011-03-07 13:10:27

好吧..。在构造函数类型中使用global比这一点更重要。考虑将其作为参数__construct($mysqli)传入。

代码语言:javascript
复制
  public function __construct($mysqli)
  {
    $this->mysqli = $mysqli;
  }

你在这里试图做的事情叫做依赖注入。

票数 3
EN

Stack Overflow用户

发布于 2011-03-07 13:12:07

您的构造函数没有被调用,因为它根本不是构造函数。

代码语言:javascript
复制
__cuntruct

应该是

代码语言:javascript
复制
__construct
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5220096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档