Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP mysqli“;对非对象调用成员函数query();来自其他班级_Php_Mysqli - Fatal编程技术网

PHP mysqli“;对非对象调用成员函数query();来自其他班级

PHP mysqli“;对非对象调用成员函数query();来自其他班级,php,mysqli,Php,Mysqli,可能重复: 我有两门课: 数据库类 Libtables类 在数据库类中,我创建了一个对象,用于在整个脚本中使用mysqli。当我试图从.php文件中的数据库类调用函数时,它会起作用 简化数据库类: class Database { protected static $_instance; protected $_mysqli; protected $_query; public function __construct($host, $username, $password, $db)

可能重复:

我有两门课:

  • 数据库类
  • Libtables类
  • 在数据库类中,我创建了一个对象,用于在整个脚本中使用mysqli。当我试图从.php文件中的数据库类调用函数时,它会起作用

    简化数据库类:

    class Database {
    
    protected static $_instance;
    protected $_mysqli;
    protected $_query;
    
    
    public function __construct($host, $username, $password, $db) {
        $this->_mysqli = new mysqli($host, $username, $password, $db)
            or die("There was a problem connecting to the database");
    }
    
    public function close() {
    
        $this->_mysqli->close();
    
    }
    
    public function query($q) {
        return $this->_mysqli->query($q);
    }
    
    }

    但是,当我试图从Libtables类中的数据库类调用函数时,它失败了,我得到了一个名为: “对非对象调用成员函数query()”

    简化Libtables类:

    class Libtables {
    
        function getCol($table) {
        $q = "SELECT * from " . $table . ";";
        $res = $db->query($q);
        return $res;
        }
    
    }
    
    我通过以下方式创建了一个数据库类对象:

    $db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    global $db;
    

    您需要
    global$db在getCol函数中

    function getCol($table) {
        global $db;
        $q = "SELECT * from " . $table . ";";
        $res = $db->query($q);
        return $res;
    }
    

    根据下面的评论进行编辑

    另一个选项是将DB作为属性存储在类中。以下是一个简化的回答。(您应该考虑将
    var$db
    设为私有并通过构造函数传入。有关更多详细信息,请参阅有关变量范围和对象构造函数的文档。)


    您遇到的问题与范围有关。
    $db
    变量未在
    Libtables
    类中初始化

    您可以通过在需要使用的函数中定义
    $db
    变量global来实现这一点,即

    class Libtables 
    {
        public function getCol($table) 
        {
            global $db;
    
            $q = "SELECT * from " . $table . ";";
            $res = $db->query($q);
    
            return $res;
        }
    }
    
    或者,您可以通过类构造函数注入变量,以便可以在任何地方使用它(代码比使用globals更简洁)

    创建
    Libtables

    $db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    .....
    $lib = new Libtables($db);
    

    谢谢大家。现在,它可以将数据库对象传递给libtables类。

    您是否阅读了有关的文档?但是如果该类中有100个函数,是否需要添加全局$db;每一个功能?是的,如果你这样做的话。另一种方法是将DB连接存储为类的属性,并引用$this->DB->query()@Angelo a:justice。这就是为什么
    global
    是邪恶的。您需要将其传递给
    Libtables
    构造函数,并将其存储为类属性这不是我对受保护变量$\u mysqli所做的吗?受保护变量在数据库类中,而不是在Libtables中。您可以让libtables扩展数据库,但我认为这不是您想要做的。
    class Libtables 
    {
        private $_db;
    
        public function __construct($db)
        {
            $this->_db = $db;
        }
    
        public function getCol($table) 
        {
            $q = "SELECT * from " . $table . ";";
            $res = $this->_db->query($q);
    
            return $res;
        }
    }
    
    $db = new Database(DB_HOST, DB_USER, DB_PASS, DB_NAME);
    .....
    $lib = new Libtables($db);