我正在研究一个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...)
}
Run Code Online (Sandbox Code Playgroud)
在我的理解中,这可以通过使BaseModel成为特征而不是构造函数来解决,因为当traits定义static属性时,每个继承类都有自己的值.我会将$info模型的实现中的数组复制到特征中,可能在构造函数中,这样我就可以self::info['tableName']在BaseModel的所有函数中使用...
这是个好主意吗?
最简单和最合适的工具是使用后期静态绑定:
function save(){
$modelInfo = static::$info;
/* lots of other stuff */
}
Run Code Online (Sandbox Code Playgroud)