【发布时间】:2013-12-04 11:59:25
【问题描述】:
我正在设置我继承的框架的新部分。这是一个真正执行一些最佳实践的机会,所以我正在尝试尽可能多地做。
框架运行在php5.4(windows环境)。
我已经设置了一个抽象类 BaseModel。在此我定义了几个核心功能,例如:通用访问器和通用数据库交互。
然后我扩展它以创建我将使用的模型。在测试用例中,文件“UserModel”创建了一个名为“User”的类。
在 BaseModel 中,我正在创建以下抽象函数:
abstract public function getById($id);
然后我在 UserModel 中定义这个函数
public function getById($id)
{
// just a test!
return 'this works!';
}
我想强制执行类型安全。但是,如果我这样做,我会得到错误:
public function getById(User $id)
{
// just a test!
return 'this works!';
}
我可以做到以下几点
abstract public function getById(BaseModel $id);
public function getById(BaseModel $id)
{
// just a test!
return 'this works!';
}
这很有效,但说实话也没那么有用。 User 是 BaseModel 类型,但其他所有扩展类也是。我想做的是这样的:
abstract public function getById(BaseModel $id);
public function persist(User $item)
{
// just a test!
return 'this works!';
}
我知道我可以添加一行进行手动类型检查,沿着这些行(伪代码)
if ($item instanceof User)
{
//do stuff
}
但是 - 这似乎是一种解决方法,而不是找到真正的方法。
我有一种下沉的感觉,这种“智能/感知类”功能在 php 中是不可用的。
任何人都可以确认/否认这一点或提供更优雅的解决方法吗?
【问题讨论】:
-
我不认为这是一个重复,因为那个是关于接口的,而不是抽象类。虽然要回答的原因可能相同,但问题却不同。
-
现在我更不喜欢php了..
标签: php class inheritance abstract-class