一个类中的方法括号里面为什么能使用一个实例化的对象,而且这个对象还能做一些事情

忽然想起来这个问题,找不到一个无错的答案,特此求教大家,谢谢

讨论数量: 9

什么意思,示例代码?

3年前 评论
Xianbing (楼主) 3年前
klusfq

说的是8.1版本的特性吧

3年前 评论
Xianbing (楼主) 3年前

file 不好意思是我没说清楚,请看一下我新上传的示例代码

3年前 评论
李先森 3年前
月亮☪ 3年前

这是契约也叫接口,相当于现实中的合同,保证类中的 serializeData 方法传入的参数必须实现 DataTimeInterface中的接口,否则不能保证 return $data->format('Y-m-d'); 这段代码的正确。

而且这个对象还能做一些事情

实际上这个对象能做的事情是DataTimeInterface 里规定的方法

再打个比喻,serializeData 方法假如要播放一个视频,那接收参数必须实现了播放功能,不管你是qq播放器还是迅雷播放器,如果没有实现这个契约的,就会报错。

// 假如这是播放器的契约,必须实现播放功能
interface DataTimeInterface {
    public function format(string $f);
}
// qq播放器必须实现契约,否则就会报错
class DateTimeFormat implements DataTimeInterface {
    public function format(string $f){
        return date($f, time());
    }
}
// qq播放器符合契约,合格
var_dump( (new DateTimeFormat) instanceof DataTimeInterface);// true 

serializeData(DataTimeInterface $data) 就是一种写法,DataTimeInterface 相当于播放器接口(或契约),$data 就是qq播放器或者什么播放器,传入一个记事本肯定会报错。
可以再打个比喻,一个笔记本电脑厂家,不可能所有零件都自己生产吧,会从各个厂家购买,购买的零件能不能用? 你不得说明规格啥的,和这里是一样的。

3年前 评论
Xianbing (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!