PHP - 设计模式之 魔术方法

__get和__set

 

1、实例化一个类,然后,调用一个未定义的方法

 

 

访问:

 

2、但如果我们使用了__set和__get方法,也就是在该object类中,加入这两个方法,看看会怎么样?

 

 

我们给一个未定义的属性赋值:

 

 

浏览器查看结果:

已经没有报错了!

 

再看结果:

 

从以上,我们能够看出,调用是先经过了__set方法,将没有的属性和值放到了映射数组,然后,调用的时候,又经过了__get方法,它又获取了映射数组,给我们返回了结果。

 

__call和__callStatic

1、如果我们实例化完一个类,调用一个该类没有定义的方法时,这时候,会怎么样呢?

 

访问:

 

2、那么,这种情况,该如何应对呢?我们可以使用__call魔术方法,在该类中加入此方法:

 

访问输出一下:

 

以上输出分为两部分,前者,是var_dump出来的方法名称和参数,后者,是在__call方法里的输出。

 

3、如果我们去访问一个类的不存在的静态方法,那么,会怎么样呢?

 

访问:

 

4、那么,这种情况如何处理呢,我们可以用另外一个魔术方法__callStatic,操作如下:

 

再次访问:

 

所以,为了防止调用未定义的静态方法导致报错,我们可以在类中定义__callStatic方法规避。

 

__toString

 

1、如果你要echo一个对象,猜猜会怎么样?

 

访问一下:

 

 

2、那万一有人这么访问,或者,在平时的开发当中,无意中,这么输出了,该怎么办?我们决不能让用户看到这种报错!这时,__toString就登场了。

 

再次访问:

提示,方法必须为public属性,更改一下:

 

再次访问:

 

__invoke

1、在PHP中,如果我们把一个对象当做函数去用,那么,会怎么样呢?

 

 

2、如何处理,使用__invoke魔术方法,如下:

 

 

再次访问:

 

 

刚刚,在没有创建__invoke方法的时候,直接将对象当方法输出的时候,IDE已经提示红线,可当我创建完__invoke方法后,已经没有警示提示了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值