我现在正在学习OOP,我有一个属性,指定它应该是什么类。
class Controller{
public ?Model $model;
}
class LoginModel extends Model{
public function login(){}
}
现在,我想加载一个继承了Model的类,但包含了一个不来自Model的唯一方法。这会导致lint认为代码中存在错误。是否有办法解决控制器模型的问题?
$controller = new Controller();
$controller->model = new LoginModel();
echo $controller->model->login();
我知道一种方法是我们可以将Model更改为LoginModel,但如果有很多不同的控制器,具有不同的模型,设计用于做不同的事情,那将是乏味的。
考虑这个例子
class Controller
{
public ?Model $model;
}
class Model { }
class LoginModel extends Model
{
public function login() { }
}
class LogoutModel extends Model { }
$controller = new Controller();
$controller->model = new LoginModel();
$controller->model->login(); //This works
$controller->model = new LogoutModel();
$controller->model->login(); //This doesn't works
这个lint是说你不能保证会有一个login()
调用。所以除非你在所有模型中都有一个login()
方法,在这种情况下,你可以定义一个抽象或接口,否则因为它可能失败,它会显示你的错误。
PS:有一种方法可以绕过它,但我不建议经常使用它。
if($controller->model instanceof LoginModel)
{
$controller->model->login(); //This works
}