[英]PHP reference pass makes new instance of an object?
我有一個ParentClass,當我創建一個新對象時,我想傳遞一個對ParentClass的引用。 (我必須在新對象中使用ParentClass的東西)
我使用構造函數來創建此對象並傳遞引用值。 (這對我很重要)
但是當我使用=&
運算符時,它會創建一個ParentClass的新實例,調用構造函數,然后它就會無限遞歸。
這是我的代碼:
<?php
abstract class MainClass {
function __construct(&$parent){
$this->parent =& $parent;
$this->init();
}
abstract protected function init();
}
class ParentClass extends MainClass {
protected function init(){
$this->child = new ChildClass($this);
}
}
class ChildClass extends MainClass {
protected function init(){}
}
$parent = new ParentClass (new stdClass());
var_dump($parent);
?>
結果如下:
object(ParentClass)#1 (2) {
["parent"]=>
object(stdClass)#2 (0) {
}
["child"]=>
object(ChildClass)#3 (1) {
["parent"]=>
object(ParentClass)#1 (2) {
["parent"]=>
object(stdClass)#2 (0) {
}
["child"]=>
object(ChildClass)#3 (1) {
["parent"]=>
*RECURSION*
}
}
}
}
我怎么解決這個問題?
默認情況下,對象通過引用傳遞。 沒有理由通過引用傳遞或分配$parent
。 所以這應該足夠了:
abstract class MainClass {
function __construct($parent){
$this->parent = $parent;
$this->init();
}
使用&$parent
可能很重要,但這完全沒必要。
關於遞歸:代碼中沒有遞歸,它是輸出中的遞歸。
這部分:
object(ChildClass)#3 (1) { // <--- the same element
["parent"]=>
object(ParentClass)#1 (2) {
["parent"]=>
object(stdClass)#2 (0) {
}
["child"]=>
object(ChildClass)#3 (1) { // <--- the same element
["parent"]=>
*RECURSION*
}
}
}
將被反復打印,因為孩子對其父級和父級的引用是對其子級的引用。
也許更明顯的是輸出中的重復數字:
object(ParentClass)#1 // 1
object(stdClass)#2 // 2
object(ChildClass)#3 // 3
object(ParentClass)#1 // 1
object(stdClass)#2 // 2
object(ChildClass)#3 // 3
// what would be here? right, object(ParentClass)#1 again
這很正常,沒有問題。
更好的設計。
您不應該需要對父類的引用。 如果有方法需要類似的東西,那么它們應該是覆蓋所有子對象的靜態方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.