2011-12-11 59 views
2

我在与PHP类的继承和范围问题作斗争。基本上我有一个基类,其中有许多有用的方法(创建,保存,加载),其中devs当前将table_name传递给。我想创建一堆模型类,它们是空的,但扩展了&继承基类,并且可以具有调用相同名称的方法而不是基类版本。从子类扩展一个类并访问常量

im下面的代码努力从模型类的静态方法中获取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()); 
+1

当你用'self ::'引用一个类属性时,你试图调用一个静态属性。你的'private $ table_name;'不是一个静态属性,它是一个实例属性。 '私人静态$ table_name;'至少会解决这个问题,尽管我不认为这就是你所犯的错误。 –

回答

1

看看一些PHP OOP教程。

没有办法让事情成为现实。接下来是一个。例如,在Java中,通常为每个属性创建一个get/set方法。通过这种方式,您可以从任何子类访问它,而无需使用受保护的关键字并获得清晰度。

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

如果你有一个的MyMethod()在父类和要实现它的子类,但以不同的方式,简单地创建一个子类中的MyMethod()和使用getTableName时()可以得到表名称属性。

如果你的subclass.MyMethod()实现需要调用parent.MyMethod(),那么使用parent :: MyMehtod()(http://www.php.net/manual/en/keyword.parent.php )

+0

说出学习PHP OOP然后立即开始引用另一种语言(即使你只是谈论常见的做法)可能不是一个好主意。毕竟,PHP确实有'__get()'和'__set()'。 –

+0

我知道PHP的操作方式。令人遗憾的是,这个类与其在整个项目中所使用的类似,并且更好的解决方案是调用设置表名称的实例并且不使用静态方法。唉,我认为这里的某个人可能有一个想法,如何解决,而不是主意。 – azz0r

0

您需要使您的create方法非静态,或者您的table_name变量是静态的。

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