2016-12-18 9 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?

Также при установке видимости частного, переменная NULL/EMPTY, когда вызывается из класса В.

EDIT:

Это швы дает мне нужный результат, спасибо всем за Помогите.

<?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

Вы определили 'fun_test' в подклассе' Ā'. 'A' не может наследовать метод из своего подкласса' B'. – Mike

+0

@Mike, класс A, однако, не нужно наследовать метод funTest из класса B. – Alex

+0

Это не значит, что он должен «наследовать» метод, но класс 'A' не имеет определения для' fun_test'. Класс 'B' имеет знания и доступ ко всем полям и методам из класса' A', но класс 'A' не имеет доступа к методам или полям из класса' B'. Когда вы вызываете 'fun_test' в' B', вы произносите только значения 'B'. Значения 'A' остаются' NULL'. – Mike

ответ

0

В комментарии указует: с new ключевым словом, вы создаете новый экземпляр B и что-нибудь со ссылкой $this только обновляют значения внутри экземпляра B и значений внутри остается неизменным.

Чтобы обновить A изнутри B без копирования, вы можете сделать что-то вроде ниже. Я приспособил код с параметром $target, чтобы вы могли пройти вдоль $this с funTest

<?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, чтобы «сделать работу». – Alex

+0

Я пропустил ту часть, где вы добавили $ target->. Гораздо ближе к тому, что я ищу. – Alex

+0

Проблема в том, что A или B могут иметь любые данные, прежде чем создавать экземпляр ('new'). И если вы создадите два экземпляра ($ a и $ b), будет два места, где будут жить данные. –

 Смежные вопросы

  • Нет связанных вопросов^_^