接口
interface IAdminController
{
const service = "111";
// function index(): View;
function data(): array;
function show($id): View;
function create(): View;
function save(Object $request): array;
// function update($id, AdminRequest $request): array;
function delete($id): array;
}
其中我在 function save(Object $request): array;
这个方法这里指定了参数为object
实现类
function save(AdminRequest $request): array
{
$data = $request->input('admin');
$data['password'] && $data['password'] = md5($data['password']);
$temp = $this->service->create($data);
return parent::res($temp);
}
这就报错了。
主要的报错信息为:
xxxxx must be compatible with xxxx
应该是说我两个类型不一致。
但是我单独用gettype($adminRequest);
来打印这个AdminRequest 显示又是object.
这个我就有点懵了。。请问
1、为什么会这样,是哪里错了呢?
2、由于我很多个reqeust
类,有AdminReqest
、UserRequst
等等,所以我的接口定义就不能写死,所以我这里就用了object
,但是若object
和 XXXRequst
不是同类型,我应该怎么来写这个接口的参数,让所有的xxxReqeust
都能当参数使用(xxreqeust继承laravel 的reqeust)
你这里指定为
object
本身就是一种没有意义的应为了,如果你真想确定传进来的是一个对象,你可以创建一个空接口,后面要传入进来的类都实现这个接口,或者在方法签名不限制,而是在方法内部去检查(这并没有任何意义),另外你这里既然提到了 xxxRequest 都继承自 Laravel 的 Request ,那你可以直接在接口这里限定为 Laravel 的 Request 即可(传入的只要是这个类的后代类即可)。根据协变与逆变的规则,子类参数签名允许比父类更加宽泛,返回类型签名允许比父类更加具体,放在你这里则自然不适合(object -> xxxRequest) 是从宽泛 -> 具体 的过程了。
误,之前使用 PHP 旧版(7.1)测试时本发现 object 作为方法签名类型,传入对象时会报错,方才使用 php 8.1 再行测试已经是可用(7.2+) 时可用。
另外值得一提的是,PHP 7.2(不含) 之前 PHP 中的 object 是个 “特殊的类型”,虽然可以用做签名类型,但是实际并不合法。
但是,这个并没有过多的用途。
使用
is_a
可以用来验证,任何对象返回都是 false ,包括 stdClass。另见: