2016-12-18 35 views
-1

運行此腳本時,我收到了一些奇怪的反應。奇怪的PHP反應

<?php 

    error_reporting(E_ALL); 

    class A { 
     protected $varOne = array(
      "subVar1" => "", 
      "subVar2" => "", 
      "subVar3" => "", 
      "subVar4" => "", 
     ); 

     public function init() { 
      $b = new B(); 
      $b->funTest(); 
      echo("One Two Three"); 
      echo("<br />"); 
      print_r($this->varOne); 
      echo("<br />"); 
     } 

     protected function setValue($key, $value) { 
      $this->varOne[$key] = $value; 
     } 
    } 

    class B extends A { 
     public function funTest() { 
      $this->setValue("subVar1", "21"); 
      $this->setValue("subVar2", "22"); 
      $this->setValue("subVar3", "23"); 
      $this->setValue("subVar4", "24"); 
      echo("Four Five Six"); 
      echo("<br />"); 
      print_r($this->varOne); 
      echo("<br />"); 
     } 
    } 

    $a = new A(); 
    $a->init(); 

現在這裏輸出麻煩了我。

OUTPUT: 
Four Five Six // As Expected 
Array ([subVar1] => 21 [subVar2] => 22 [subVar3] => 23 [subVar4] => 24) // As Expected 
One Two Three // As Expected 
Array ([subVar1] => [subVar2] => [subVar3] => [subVar4] =>) // Wait, WTF? 

爲什麼變量在從A類調用時是空的?

而且能見度設置爲私有時,從B類調用時變量爲空/空

編輯:

這接縫給我我需要的結果,感謝所有爲幫幫我。

<?php 

error_reporting(E_ALL); 

class A { 
    protected $varOne = array(
     "subVar1" => "", 
     "subVar2" => "", 
     "subVar3" => "", 
     "subVar4" => "", 
    ); 

    public function init() { 
     echo("One Two Three"); 
     echo("<br />"); 
     print_r($this->varOne); 
     echo("<br />"); 
     $b = new B(); 
     $this->varOne = $b->funTest(); 
     echo("One Two Three"); 
     echo("<br />"); 
     print_r($this->varOne); 
     echo("<br />"); 
    } 

    protected function setValue($key, $value) { 
     $this->varOne[$key] = $value; 
    } 
} 

class B extends A { 
    public function funTest() { 
     $this->setValue("subVar1", "21"); 
     $this->setValue("subVar2", "22"); 
     $this->setValue("subVar3", "23"); 
     $this->setValue("subVar4", "24"); 
     return($this->varOne); 
    } 
} 

$a = new A(); 
$a->init(); 
+0

你在'A'的子類中定義'fun_test'。 'A'不能從它的子類'B'繼承這個方法。 – Mike

+0

@Mike,A類不需要從B類繼承funTest方法。 – Alex

+0

這並不是說它需要'繼承'方法,而是'A'類沒有'fun_test'的定義。 「B」類具有對「A」類中的所有字段和方法的瞭解和訪問,但「A」類不能訪問類「B」中的方法或字段。當你在'B'中調用'fun_test'時,你只會影響'B'的值。 'A'的值保持爲NULL。 – Mike

回答

0

正如評論指出:與new關鍵字創建B和任何參照的B實例和值的內內$this只會更新值的新實例保持不變。

要在B中更新A而無需複製粘貼該方法,您可以執行下面的操作。我適應代碼與$target參數,所以你可以沿着$thisfunTest

<?php 

error_reporting(E_ALL); 

class A { 
    protected $varOne = array(
     "subVar1" => "", 
     "subVar2" => "", 
     "subVar3" => "", 
     "subVar4" => "", 
    ); 

    public function init() { 
     $b = new B(); 
     $b->funTest($this); 
     echo("One Two Three"); 
     echo("<br />"); 
     print_r($this->varOne); 
     echo("<br />"); 
    } 

    protected function setValue($key, $value) { 
     $this->varOne[$key] = $value; 
    } 
} 

class B extends A { 
    public function funTest($target) { 
     $target->setValue("subVar1", "21"); 
     $target->setValue("subVar2", "22"); 
     $target->setValue("subVar3", "23"); 
     $target->setValue("subVar4", "24"); 
     echo("Four Five Six"); 
     echo("<br />"); 
     print_r($target->varOne); 
     echo("<br />"); 
    } 
} 

$a = new A(); 
$a->init(); 

通過這使你的預期行爲:

Four Five Six 
Array ([subVar1] => 21 [subVar2] => 22 [subVar3] => 23 [subVar4] => 24) 
One Two Three 
Array ([subVar1] => 21 [subVar2] => 22 [subVar3] => 23 [subVar4] => 24) 
+0

感謝您的答案,除了我試圖讓B類只是獲得類的數據A to do「work work」 – Alex

+0

我錯過了你添加$ target->的部分,更接近我要找的東西。 – Alex

+0

麻煩的是,在你創建一個實例('new')之前,A和B可以有任何數據。如果您創建兩個實例($ a和$ b),則會有兩個數據所在的位置。 –