【问题标题】:php extended class not inheriting parents current property valuesphp扩展类不继承父母当前属性值
【发布时间】:2015-03-27 13:17:27
【问题描述】:

我对课程还很陌生。我不明白为什么我的扩展类不会继承它的父属性,作为他们的集合。它似乎在其构造函数值处继承属性。

确保继承当前值的正确方法是什么?

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,您可以使用$FormField->UpdateTheValue(...) 设置值,但奇怪的是,我不确定为什么它没有发出有关必需参数的警告,因为new FormField(); 有效地调用new Form() 而没有任何$data(应该是必需的)
  • 谢谢。我需要事先在脚本中调用 Form。后来根据情况,引入FormField。所以我想知道如何保持 Form 中的设置值?

标签: php class oop


【解决方案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);

【讨论】:

  • @DarkBee:可能,但这超出了我的回答范围。我将我的答案限制在试图解释类和对象之间的区别。
  • 感谢您的回答。这是否意味着我不能事先定义 Form ?我想调用 $Form>New Form();然后再定义FormField?
  • 您可以定义Form,这是一个。另一方面,$Form 是一个 object,它是 Form 类的一个实例。一个类只能有一个定义(在一个命名空间中),但该类可以有多个实例。
  • 好的,如果我事先定义了 $Form 。稍后我定义了一个$FormField 对象,$Form 中的变量将如何传递给$FormField?正如在上面的代码中定义了 $FormField (没有 $Form)。对我的不理解深表歉意,并感谢您的帮助。
  • 要知道你正在尝试构建什么以及如何构建你正在构建的东西真的不容易,但我用一些额外的代码做了我的猜测。
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 1970-01-01
相关资源
最近更新 更多