我刚学习PHP不久,最近在看PHP自带的Observer设计模式的快速实现时候遇到了一个问题。
我发现PHP自己实现的SplObjectStorage类里所有的方法的body都是空的,我想模仿出一个storage的类,于是考虑着自己去实现attach方法。
问题来了
我先尝试写出观察者模式,实例化之后再输出类的结构:$observer = new Observer();//观察者
$subject = new Subject();//内部实例化了SplObjectStorage类
$subject->attach($observer);
print_r($subject);结果输出:
Subject Object (
[observer:protected] => SplObjectStorage Object (
[storage:SplObjectStorage:private] => Array (
[000000007ded8f200000000054db3de3] => Array (
[obj] => Observer Object ( ) [inf] => ) ) ) )
瞬间蒙了...attach之后storage存储的key似乎是两个16个长度的字符串拼接起来的,看起来有点像两个内存地址,从这里我也想到attach方法实现的难度了,key值必须是再当前情况下唯一的并且与实例化对象相关,这个是如何实现的呢,如何确定传过来的对象的identity呢。请各位大佬不吝赐教。
我发现PHP自己实现的SplObjectStorage类里所有的方法的body都是空的,我想模仿出一个storage的类,于是考虑着自己去实现attach方法。
问题来了
我先尝试写出观察者模式,实例化之后再输出类的结构:$observer = new Observer();//观察者
$subject = new Subject();//内部实例化了SplObjectStorage类
$subject->attach($observer);
print_r($subject);结果输出:
Subject Object (
[observer:protected] => SplObjectStorage Object (
[storage:SplObjectStorage:private] => Array (
[000000007ded8f200000000054db3de3] => Array (
[obj] => Observer Object ( ) [inf] => ) ) ) )
瞬间蒙了...attach之后storage存储的key似乎是两个16个长度的字符串拼接起来的,看起来有点像两个内存地址,从这里我也想到attach方法实现的难度了,key值必须是再当前情况下唯一的并且与实例化对象相关,这个是如何实现的呢,如何确定传过来的对象的identity呢。请各位大佬不吝赐教。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货