魔术方法是以两个下划线 '__' 开头,具有特殊作用的一些方法,可以看做 PHP 的 “语法糖”。
语法糖:指那些没有个计算机语言添加新功能,而只是对人类来说更 “甜蜜” 的语法,语法糖往往给程序员提供了更实用的编码方式或者一些技巧的用法,有益于更好的编码风格,是代码更易读。不过其并没有给语言添加什么新东西。PHP 里的引用、SPL 等都属于语法糖。
PHP中的魔术方法常用的有 __set()、__get()、__call()、__callStatic()、__toString()、__construct()、__destruct()。
若在类中定义了 __set()、__get() 这一对魔术方法,那么当给对象属性赋值或者取值时,即使这个属性不存在,也不会报错,一定程度上增强了程序的健壮性。
当调用一个不可访问的方法(如未定义,或者不可见)时,__call() 会被调用。跟 __call() 方法配套的魔术方法是 __callStatic() 。当然,使用魔术方法 “ 防止调用不存在的方法而报错 ”,并不是魔术方法的本意。实际上,魔术方法是方法的动态穿件变为可能,这在 MVC 等框架设计中是很有用的语法。假设一个控制器调用了不存在的方法,那么只要定义了 __call() 魔术方法,就能友好的处理这种情况。通常 __callStatic() 也可用于 ORM 中实现动态创建和延迟绑定。
再看另外一个魔术方法 __toString 用于打印一个对象时,看看这个对象都有哪些属性,其值是什么,如果定义了 __toSting() 方法,就能在测试时打印出对象体,对象就会自动调用它所属类定义的 __toString 方法,也可以自己定制,更易于理解。
为什么直接 echo 输出一个对象就会报语法错误,而如果这个对象实现 __toString() 方法后就可以直接输出呢?原因很简单,echo 本来就可以打印一个对象,而且也实现了这个借口,但是 PHP 对其做了个限制,只有实现 __toString() 后才云讯使用,这个从 php 的源代码里可以得到验证,由此可见,魔术方法并不神奇。
只是在实际开发中,魔术方法就经常用到了。