【问题标题】:When Class A extends Class B and they both have the same Property当 A 类扩展 B 类并且它们都具有相同的属性时
【发布时间】:2012-07-13 09:14:58
【问题描述】:

我有 A 类和 B 类。A 类扩展了 B 类。

它们都有 $fields 属性,其中 $fields 是一个数组,例如:

A 类字段

public $fields = array( 'id'=>'', 'product'=>'', 'productXpath'=>'', 'price'=>'', 'priceXpath'=>'', 'currency'=>'', 'website_url'=>'', 'url_id'=>'', 'day'=>'', 'month'=>'', 'year'=>'', 'time'=>'', 'status'=>'' );

B 类字段

public $fields = array( 'id'=>'', 'website'=>'', 'visits'=>'', 'plugin_id'=>'', 'status'=>'' );

只有数组内的结构和值不同。

我需要访问这两个属性,我该怎么做?

【问题讨论】:

  • 您能否发布您的代码,因为我对“只有数组中的结构和值不同。”有点困惑?
  • 你不能用Product类代替array()

标签: php class extends


【解决方案1】:

编辑:

如果您可以控制 B 类,只需定义一个 getter 并将 $fields 设为私有:

public function getFields() {
    return $this->fields;
}

那么在A类你可以这样做:

public function getFields() {
    $parentFields = parent::getFields();
    // Do something with $parentFields
    return $this->fields;
}

如果没有,您必须为 A 类中的 $fields 属性指定一个不同的名称,以免丢失 B 类的值。

【讨论】:

  • 如果类 B 扩展类 C 怎么办?如何从 C 中获取字段数组?
  • @Laurent:不,你不能codepad.org/lk8KaVuG 为什么大家都赞成? :?
  • 但如果字段数组在类 A 中实例化,那么通过继承,他可以根据字段的范围和修饰符执行 $this->fields 。我们需要看代码才能完整回答问题。
  • +1 @KingCrunch 尽管完全驳回 Laurents 的回答是不公平的,因为我们不知道 $fields 上的范围或修饰符
  • @NicholasKing 我们知道:见问题public $fields = array(/* .. */);
【解决方案2】:

将属性设为静态

public static $fields = array(...);

并通过

访问变量
echo ClassName::$fields;

【讨论】:

  • 类的每个实例对于$fields 有不同的值是什么?根据他的示例,它看起来将包含一种数据库行,这意味着每个实例将具有不同的值。
  • @Laurent 我刚刚给出了另一个选择。一切都取决于他必须做什么