我确信这个问题已被问了一千次,但我找不到一个我能理解或在任何地方使用的答案。
在我的项目中,我需要在很多类中使用我的sql类和其他misc类。然后我很想知道传递物体的最佳表现方式是什么。
我应该将对象传递给类构造作为参考吗?
class MyClass {
private $_link;
function __construct(&$db) {
$this->_link =& $db;
}
}
或价值..
class MyClass {
private $_link;
function __construct($db) {
$this->_link = $db;
}
}
或只是创建一个新对象?
class MyClass {
private $_link;
function __construct() {
$this->_link = new DB();
}
}
答案 0 :(得分:2)
如果您使用的是PHP5 +,几乎在所有情况下,默认情况下都会通过引用传递对象。
答案 1 :(得分:0)
由于对象已经在PHP5 +中“通过引用”传递,然后使用&
实际上将传递“对对象引用的引用”,而不仅仅是简单的“对对象引用”。这很关键,因为它将允许该函数在其本地范围内全局更改实际引用,并有可能完全删除该对象。例如,可能会认为以下通过ref传递对象和“正常”传递对象的示例完全相同:
$aa = new stdclass;
$aa->aa = 1;
byRef($aa);
function byRef(&$aaa) {
$aaa->aa = 2;
}
var_dump($aa); // Outputs {aa:2}
$bb = new stdclass;
$bb->bb = 1;
byVal($bb);
function byVal($bba) {
$bba->bb = 2;
}
var_dump($bb); // Outputs {bb:2}
从输出来看,它看起来相同。但这是一个好习惯吗?取决于您想做什么。看同一示例,其中我们销毁了原始引用并“删除”了该对象:
$aa = new stdclass;
$aa->aa = 1;
byRef($aa);
function byRef(&$aaa) {
$aaa->aa = 2;
$aaa = 0; // We are changing $aa, not $aaa, because $aaa is just a reference
}
var_dump($aa); // Outputs int:0, $aa is not an object anymore
$bb = new stdclass;
$bb->bb = 1;
byVal($bb);
function byVal($bba) {
$bba->bb = 2;
$bba = 0;
}
var_dump($bb); // Outputs {bb:0}
代码说明一切。在某些情况下,这是必需的,而在其他情况下,这是至关重要的。在我看来,除非您真的知道自己在做什么,否则请不要通过引用。