2015-03-27 1 views
0

Я довольно новичок в классах. Я не могу понять, почему мой класс расширения не наследует его родительские свойства, как их набор. Кажется, он наследует свойства по значению своего конструктора.php расширенный класс не наследует родителей текущие значения свойств

Каков правильный способ гарантировать, что текущие значения наследуются?

class Form { 

    public $data = array(); 
    public $TheValue; 

    public function __construct($data) { 
     $this->data = $data; 
    } 

    public function UpdateTheValue($x){ 
     $this->TheValue = $x; 
    } 
} 

class FormField extends Form { 

    public function __construct() { 
     parent::__construct(); 
    } 

} 

$data = array(1,2,3); 
$Form = new Form($data); 
$Form->UpdateTheValue('the value should be this'); 
$FormField = new FormField(); 

и это является результатом $

поля формы
FormField Object 
(
    [TheValue] => 
    [data] => Array 
     (
     [0] => 1 
     [1] => 2 
     [2] => 3 
     ) 

) 

как вы можете видеть TheValue пусто.

спасибо.

+2

Это не наследует родительское значение, как вы создали новый экземпляр ... если бы вы просто создать 'FormField' в первую очередь вы можете установить значение с помощью' $ FormField-> UpdateTheValue (...) 'Как ни странно, я не уверен, почему он не бросает предупреждение о требуемых параметрах с момента появления нового FormField(); 'эффективно вызывает' new Form() 'без каких-либо' $ data' (что должно быть необходимо) – CD001

+0

Спасибо. Мне нужно вызвать форму заранее в скрипте. и позже, в зависимости от ситуации, введите FormField. Поэтому мне интересно, как сохранить установленные значения из формы? –

ответ

1

Это потому, что FormField расширяет Form класса, а не экземпляр из Form класса.

Если это сработало так, как вы думаете, что, по вашему мнению, должно произойти, если есть 2 экземпляра класса Form?

$dataA = array(1,2,3); 
$formA = new Form($dataA); 
$formA->UpdateTheValue('A'); 

$dataB = array(1,2,3); 
$formB = new Form($dataB); 
$formB->UpdateTheValue('B'); 

$formField = new FormField(); 

В вашем примере вы должны создать экземпляр FormField класса, который имеет все свойства своего родителя:

class Form { 
    public $data = array(); 
    public $TheValue; 

    public function __construct($data) { 
     $this->data = $data; 
    } 

    public function UpdateTheValue($x){ 
     $this->TheValue = $x; 
    } 
} 

class FormField extends Form {} 

$data = array(1,2,3); 
$formField = new FormField($data); 
$formField->UpdateTheValue('the value should be this'); 

Но тогда, конечно, почему бы «полевая форма» простираться «форма», чтобы иметь свои свойства? Это, очевидно, две разные сущности, которые служат двум различным целям.

Я могу только предположить, что то, что вы на самом деле пытаетесь достичь подобно этому:

<?php 
class Form { 
    private $fields = array(); 

    public function __construct($fields) { 
     $this->fields = $fields; 
    } 

    public function updateField($index, $value) { 
     $this->fields[$index]->setValue($value); 
    } 
} 

class FormField { 
    private $value; 

    public function __construct($value) { 
    $this->setValue($value); 
    } 

    public function setValue($value) { 
    $this->value = $value; 
    } 
} 

$fields = array(
    new FormField('A'), 
    new FormField('B'), 
); 

$form = new Form($fields); 
var_dump($form); 

$form->updateField(0, 'AAA'); 
$form->updateField(1, 'BBB'); 
var_dump($form); 
+0

Или работайте с DI вместо наследования – DarkBee

+0

@DarkBee: Возможно, но это выходит за рамки моего ответа. Я ограничиваю свой ответ, пытаясь объяснить разницу между классом и объектом. – tmt

+0

Спасибо за этот ответ. Означает ли это, что я не могу заранее определить форму? Я хотел бы вызвать $ Form> New Form(); и позже определить FormField? –

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