我正在尝试将对象作为构造函数的参数传递给类,例如:
class godtoolkit{
protected $var;
public $explanation;
public function __construct($mysqli){
$this -> var = $mysqli;
}
public function armageddon(){
$this -> var -> close();
$this -> explanation = "The World Ended!";
return true;
}
}
$goddemands = new godtoolkit($mysqli); // $mysqli is a normal mysqli connection
if($goddemands -> armageddon()){ // Is this closing my database?
echo($goddemands -> explanation);
}
问题在代码示例中很明显,请记住这是一个示例代码段,但确切地询问我需要什么。
答案 0 :(得分:1)
简短:是的,这将关闭MySQLi连接。
为什么:值得注意的是,在PHP中,对象始终通过引用传递。也就是说,变量实际上是一个指向该对象的内存空间的链接,并且无论该变量的值在何处,它总是指向内存中的相同空间,因此也是同一个对象。
示例:强>
以下说明了复制传递,按引用传递以及对象如何工作之间的区别:
function copy_increment($int) {
$int++;
}
function reference_increment(&$int) {
$int++;
}
function object_increment($object) {
$object->int++;
}
function maybe_destroy($object) {
unset($object);
}
$object = new StdClass();
$object->int = 1;
$int_val = 1;
var_dump($int_val); // 1
copy_increment($int_val); // Not passed by reference
var_dump($int_val); // 1
reference_increment($int_val); // Passed by reference
var_dump($int_val); // 2
var_dump($object); // int = 1
object_increment($object); // Always passed by reference
var_dump($object); // int = 2
// But here you can see that the parameters are
// still copies, but copies of the pointer and
// un-setting only effects the current scope.
maybe_destroy($object);
var_dump($object); // int = 2
您可以在行动here中看到这一点。这对你的情况意味着什么?这意味着,是的,当您传递MySQLi连接并存储它,然后关闭它时,它将始终关闭该对象的所有副本。
这里有一个问题,你可以克隆对象,但MySQLi就是他们称之为"不可克隆的对象,"如果你试试......它会杀了你的应用程序: - (
要注意: MySQLi连接不需要"需要"要显式关闭,连接将在对象被销毁时(在应用程序结束时或在垃圾收集期间)终止,因此您永远不必在其上显式调用close。
另一个选择是拥有一个按需构建连接的工厂类或函数。将此对象传递给构造函数,并将唯一连接存储在此对象上。我不能立刻想到为什么这会有用,但设置相当容易,并且可以让你整天关闭连接。 ; - )
实际上,你不需要手动关闭它,特别是如果你刚开始的话。
答案 1 :(得分:0)
是的,调用armageddon()将关闭在类的构造函数中传递的mysqli连接。