我正在开发一个MVC应用程序,其中使用所有实际模型必须扩展的抽象基类来实现Model。在每个模型中都有一些关于该模型的信息,目前实现为数组,请调用protected static $info
。因此,每个模型都有一个不同的$info
数组。现在,基类有很多函数使用来自该数组的数据,目前这些函数中的每一个都以下面的示例save()函数开头。
abstract class BaseModel {
function save(){
$className = get_called_class();
$modelInfo = $className::$info;
/* lots of other stuff */
}
}
class User extends BaseModel {
protected static $info = array("tableName" => "tblUsers", etc...)
}
在我的理解中,这可以通过使BaseModel成为特征而不是构造函数来解决,因为当traits定义static
属性时,每个继承类都有自己的值。我会将$info
数组从Model的实现复制到trait,可能在构造函数中,这样我就可以在BaseModel的所有函数中使用self::info['tableName']
...
这会是一个好主意吗?
答案 0 :(得分:6)
最简单,最合适的工具是使用late static binding:
function save(){
$modelInfo = static::$info;
/* lots of other stuff */
}