php合并类变量而不是替换它们

时间:2012-10-03 12:18:01

标签: php arrays merge multiple-inheritance

我有多个php类

// a Base class
abstract class Base_Page {
   protected static $config = array(
      'status' => 'int',
   );
}
// an inheriting class
class Page extends Base_Page{
   protected static $config = array(
      'title' => 'varchar',
      'description' => 'text',
);
// and one more level of inheritance
class Page_Redirect extends Base_Page {
   protected static $config = array(
      'href' => 'http://domain.com',
   );
}

现在我想这样做:

$page_redirect = new Page_Redirect();
$page_redirect->getConfig(); // which i assume to be implemented (this is my problem)
// should return:
// array(
//    'status' => 'int',
//    'title' => 'varchar',
//    'description' => 'text',
//    'href' => 'http://domain.com',
// )

由于变量被扩展类覆盖,因此无法实现此目的。谢谢你看一下。

2 个答案:

答案 0 :(得分:0)

你不能用裸产品做这件事。使用方法会好得多:

abstract class Base_Page {
   protected function getConfig() {
       return array('status' => 'int');
   }
}

// an inheriting class
class Page extends Base_Page{
   protected function getConfig() {
       return array(
          'title' => 'varchar',
          'description' => 'text',
       ) + parent::getConfig();
   }
}

// and one more level of inheritance
class Page_Redirect extends Base_Page {
   protected function getConfig() {
       return array(
          'href' => 'http://domain.com',
       ) + parent::getConfig();
   }
}

当然,现在你已经失去了静态获取配置的能力,但这很可能与此无关。如果确实如此(即你需要知道配置而没有手头的实例,并且无意中创建一个实例)那么代码需要进一步重构。

答案 1 :(得分:0)

<?php

// a Base class
abstract class Base_Page {

    protected static $config = array(
        'status' => 'int',
    );

}

// an inheriting class
class Page extends Base_Page {

    protected static $config = array_merge(
        parent::$config,
        array(
            'title' => 'varchar',
            'description' => 'text',
        )
    );

}

尝试这样的事情。