从子类扩展类和访问常量

时间:2011-12-11 18:42:36

标签: php class

我正在与PHP类继承和范围问题作斗争。基本上我有一个基类,有一堆有用的方法(创建,保存,加载),开发人员当前传递一个table_name。我想创建一堆模型类,这些类是空的但扩展和放大继承基类,并且可以使用被调用的同名方法而不是基类版本。

下面的代码我很难从模型类的静态方法中获取table_name,有什么建议吗?

class Model_Baseclass {
    private $table_name;
    public static function create($fields) {
        $table_name = //self::table_name - parent::table_name - const $table_name
        if ($table_name == NULL) {
            throw new exception('You must specify a table.');
        }
    }
}

class Model_Content_Gallery extends Model_Baseclass {
    public $table_name = 'Content_Gallery';
}

$old = Model_Baseclass::create(array('table_name' => 'Content_Gallery'));
$new = Model_Content_Gallery::create(array());

2 个答案:

答案 0 :(得分:1)

看看一些PHP OOP教程。

没有一种方法可以制造东西。接下来是一个。例如,在Java中,通常为每个属性创建一个get / set方法。这样,您可以从任何子类访问它,而无需使用protected关键字并获得清晰度。

  • 在父类上创建getTableName()方法。
  • 在子类的实例上,您可以调用$ this-> getTableName()方法,因为它是从基类继承的。

如果您在父类上有MyMethod()并希望在子类中以不同的方式实现它,只需在子类中创建MyMethod()并使用getTableName()可以获取表名属性。

如果你子类.MyMethod()实现需要调用parent.MyMethod()然后使用parent :: MyMehtod()(http://www.php.net/manual/en/keyword.parent.php)

答案 1 :(得分:0)

您需要将create方法设为非静态,或将table_name变量设为静态。

如果你需要静态的某些方法,那么从php 5.3开始,你可以使用late static binding在静态继承的上下文中引用一个被调用的类。