PHP类对象变量用法

时间:2015-03-18 19:28:43

标签: php class object

我正在尝试将对象作为构造函数的参数传递给类,例如:

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);
}

问题在代码示例中很明显,请记住这是一个示例代码段,但确切地询问我需要什么。

2 个答案:

答案 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连接。