簡體   English   中英

PHP引用傳遞使對象的新實例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM