PHP对Java风格的类泛型有答案吗?
在PHP中构建MVC框架时,我遇到了一个问题,可以使用Java风格的泛型轻松解决。抽象的 Controller 类可能如下所示:
abstract class Controller {
abstract public function addModel(Model $model);
可能存在这样一种情况,即类 Controller 的子类应仅接受 Model 的子类。例如,ExtendedController 应该只接受 ReOrderableModel 到 addModel 方法中,因为它提供了一个 reOrder() 方法,ExtendedController 需要访问该方法:
class ExtendedController extends Controller {
public function addModel(ReOrderableModel $model) {
在 PHP 中,继承的方法签名必须完全相同,因此不能将类型提示更改为其他类,即使该类继承了超类中提示的类类型也是如此。在java中,我会简单地这样做:
abstract class Controller<T> {
abstract public addModel(T model);
class ExtendedController extends Controller<ReOrderableModel> {
public addModel(ReOrderableModel model) {
但是 PHP 中没有泛型支持。是否有任何解决方案仍然遵循 OOP 原则?
编辑我知道PHP根本不需要类型提示,但它可能是糟糕的OOP。首先,从接口(方法签名)中看不出应该接受哪种对象。因此,如果另一个开发人员想要使用该方法,那么很明显,需要X类型的对象,而不必查看实现(方法体),这是糟糕的封装并破坏了信息隐藏原则。其次,由于没有类型安全性,该方法可以接受任何无效变量,这意味着需要手动类型检查和异常抛出!