PHP - 返回MySQLi对象形式__construct方法

时间:2015-02-20 02:40:00

标签: php mysqli

我有一个Connection类看起来像:

class Connection{
    private $link;

    public function __construct(){
        $this->link = new mysqli("localhost","root","","myDatabase");
        return $this->link;
    }

    public function __destruct(){
        $this->link->close();
    }

}

我正在尝试这样做:

$link = new Connection();
$sql = "SELECT * FROM `events`";
$query = mysqli_query($link,$sql);
//Some stuff heref
$link->__destruct();

这是无效的吗?我收到以下错误:

  

警告:mysqli_query()期望参数1为mysqli

3 个答案:

答案 0 :(得分:3)

  

警告:mysqli_query()期望参数1为mysqli

这是因为$link实际上不是mysqli的实例;它是Connection的实例。

您无法从__construct()返回任何内容,因为它的目的只是构建Connection类本身的实例,而不是其他类的工厂。 return $this->link没有按照您的意图行事。

你有几个选择。

您可以创建自己的课程extend mysqli,其中您主要只是对凭据进行硬编码并使用parent::__construct()调用凭据,这样就完全无需__destruct():< / p>

// Merely extends mysqli, hard-coding your credentials
class Connection extends mysqli{
    // Your constructor has no params, and internally calls
    // the parent constructor
    public function __construct(){
        parent::__construct("localhost","root","","myDatabase");
    }    
}

你写的使用它的代码会立即起作用,但没有多少附加值,我认为这不是你想要的。

更好的选择:

如果要创建一个存储和管理mysqli对象的类,可以实例化它但不能返回它。您需要创建一个返回它的方法。

class Connection{
    private $link;

    // The constructor instantiates the mysqli
    public function __construct(){
        $this->link = new mysqli("localhost","root","","myDatabase");
    }

    // Other methods can operate on or manage the mysqli instance
    public function __destruct(){
        $this->link->close();
    }

    // Public accessor method to return the connection
    public function getConnection() {
        return $this->link;
    }
}

然后调用方法来检索连接。

$link = new Connection();
$sql = "SELECT * FROM atable";

// Call getConnection() to get the actual link
$query = mysqli_query($link->getConnection(), $sql);
$link->__destruct();

答案 1 :(得分:1)

__construct中的

Return没用,因为new运算符总是返回给定类的实例。

  

要创建类的实例,必须使用new关键字。一个   除非对象具有构造函数,否则将始终创建对象   定义为在错误时抛出异常。

http://php.net/manual/en/language.oop5.basic.php#language.oop5.basic.new

另外,尽量避免直接调用魔术方法。

答案 2 :(得分:1)

您应该执行以下操作:

<?php

class Connection{
    private $link;


    public function __construct(){
        $this->link = new mysqli("localhost","root","","myliveca_baikalpik");
    }

    public function connect(){
        return $this->link;
    }


}

$con = new Connection();
$link = $con->connect();


$sql = "SELECT * FROM `events`";
$query = mysqli_query($link,$sql);
//Some stuff heref
$link->close();
  

注意:__construct方法默认返回null。你需要什么   返回是MySQLi对象。