所以我有一个类..在它的构造函数中,我包含了通过mysqli扩展将我连接到我的数据库的代码:
class MyClass
{
public function __construct()
{
include("dbconnect");
}
}
dbconnect看起来像这样:
$host = "localhost";
$user = "user";
$pass = "123";
$database = "myDatabase";
$mysqli = new mysqli($host, $user, $pass, $database);
$mysqli->set_charset('utf8-bin');
现在我的问题:由于mysqli可以用于OOP-Style,如何在MyClass中访问变量?
function doIt()
{
$query = "SELECT * FROM myTable";
$result = $mysqli->multi_query($query);
}
调用此函数会导致
注意:未定义的变量:mysqli in ......在线...... 致命错误:在非对象上调用成员函数multi_query() 在......在线...
所以似乎变量的范围不对。有谁知道如何解决这一问题?如果MyClass不需要额外的引用或mysqli的东西,那将是最好的,因为我希望将它分开。
答案 0 :(得分:5)
$mysqli
变量仅在构造函数的范围内可用。像这样改变你的构造函数:
class MyClass
{
public function __construct()
{
include("dbconnect");
$this->mysqli = $mysqli;
}
}
现在,您可以在该对象的其他方法中使用$this->mysqli
。
答案 1 :(得分:2)
该变量与函数内的任何其他变量具有相同的范围:它仅在函数内有效。一旦函数返回,它就消失了。如果要为类中的其他函数“持久化”变量,请将其设为Class成员:
class MyClass {
var $member = null;
function foo() {
$localVar = $this->member;
$this->anotherMember = 'bar'; // $anotherMember is now available for other functions
}
}
通过include
重用代码并不恰当,因为它无法控制变量的使用方式。我考虑重组这个东西,比如创建一个建立数据库连接的函数,然后returns
数据库句柄。
答案 2 :(得分:0)
您正在寻找的是“全球”关键字。但总的来说,我会避免使用全局变量并重新考虑你的设计。