我有一个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
答案 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)
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对象。