php 扩展 class 不继承 parents 当前 属性 值
php extended class not inheriting parents current property values
我对 classes 还很陌生。我不明白为什么我的扩展 class 不会继承它的 parent 属性,就像它们的集合一样。它似乎以其构造函数值继承属性。
确保当前值被继承的正确方法是什么?
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
的结果
FormField Object
(
[TheValue] =>
[data] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
)
如您所见,TheValue 为空。
谢谢。
那是因为 FormField
扩展了 Form
class,而不是 Form
class 的 实例 .
如果它按照您假设的方式工作,如果有 2 个 Form
class 实例,您认为应该发生什么?
$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 的实例,它具有其父项的所有属性:
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');
但是当然,为什么 "form field" 扩展 "form" 以具有其属性? 这显然是两个不同的实体,服务于两个不同的实体目的。
我只能推测您实际想要实现的目标与此类似:
<?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);
我对 classes 还很陌生。我不明白为什么我的扩展 class 不会继承它的 parent 属性,就像它们的集合一样。它似乎以其构造函数值继承属性。
确保当前值被继承的正确方法是什么?
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
的结果FormField Object
(
[TheValue] =>
[data] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
)
如您所见,TheValue 为空。
谢谢。
那是因为 FormField
扩展了 Form
class,而不是 Form
class 的 实例 .
如果它按照您假设的方式工作,如果有 2 个 Form
class 实例,您认为应该发生什么?
$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 的实例,它具有其父项的所有属性:
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');
但是当然,为什么 "form field" 扩展 "form" 以具有其属性? 这显然是两个不同的实体,服务于两个不同的实体目的。
我只能推测您实际想要实现的目标与此类似:
<?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);