php深入学习二——魔术方法以及__call的调用
2017-06-11 13:03
579 查看
本文主要介绍php的魔术方法、__call这个魔术方法的调用、功能、实际应用以及注意事项。编写时,默认你已经对面向对象编程和php的面向对象编程有基本了解。
运行结果如下:
运行结果如下:
也就是说实例化一个对象后,当调用这个对象的成员方法存在时,则直接调用其成员方法,但是当成员方法不存在时,将转而去调用__call方法。
同时__call必须有两个参数,这个参数名可以随意取,但是为了方便我们通常取为$name和$args
当成员方法不存在时,__call将被调用,同时,这个不存在的方法名称会作为字符串传递给第一个参数(这里第一个参数是$name),将调用时传递的参数作为列表传递给第二个参数(这里第二个参数是$args)。
可以参考一下下方样例:
运行结果:
简单的说,__call的功能就是这样,但是它具体有什么用呢?最直接的用法就是模拟面向对象的函数重载,php类是不支持像java的多态那样用不同的参数类型、参数数量来表达相同名称的不同函数的,只要名称同名,那么运行的时候就会报错,那么为了实现函数重载(多态),我们就可以利用__call方法实现。具体可以参考我的下一篇博文http://blog.csdn.net/qq_23937195/article/details/73027244
四、使用注意事项
__call在被实现时,必须有两个参数,否则运行后可能会报错,错误格式类似下方:
只有__call方法被正确定义,当调用的方法不存在时才会调用__call方法,如果__call方法未被定义,你只会在控制台收到如下字符串打头的错误信息
一、什么是魔术方法?
魔术方法是php中对一类方法的统称,这些方法可以在任何类中被实现。他们通常可以完成一些特殊的无法纯粹依靠自己编程实现的功能。他们通常以双下划线"__"作为名称开头。也因此,你要注意自定义的方法应该避免使用双下划线"__"开头。二、什么是__call方法?
它是一种魔术变量,因此它可以在任何类中被实现,如果它被实现了,将由后台php解释器在运行过程中调用。三、什么情况下会调用__call方法及其功能?
当你调用的方法不存在的时候,会解释器会调用__call方法,如下:1.当成员方法存在的时候
<?php /** * Created by PhpStorm. * User: funco * Date: 17-6-11 * Time: 下午1:01 */ class Test { public function showInfo() { echo "run show Info"; } public function __call($name, $args) { echo "run __call"; } } $test = new Test(); $test->showInfo();
运行结果如下:
run show Info
2.当成员方法不存在的时候
<?php /** * Created by PhpStorm. * User: funco * Date: 17-6-11 * Time: 下午1:01 */ class Test { public function showInfo() { echo "run show Info"; } public function __call($name, $args) { echo "run __call"; } } $test = new Test(); $test->show();
运行结果如下:
run __call
也就是说实例化一个对象后,当调用这个对象的成员方法存在时,则直接调用其成员方法,但是当成员方法不存在时,将转而去调用__call方法。
同时__call必须有两个参数,这个参数名可以随意取,但是为了方便我们通常取为$name和$args
当成员方法不存在时,__call将被调用,同时,这个不存在的方法名称会作为字符串传递给第一个参数(这里第一个参数是$name),将调用时传递的参数作为列表传递给第二个参数(这里第二个参数是$args)。
可以参考一下下方样例:
<?php /** * Created by PhpStorm. * User: funco * Date: 17-6-11 * Time: 下午1:01 */ class Test { public function showInfo() { echo "run show Info"; } public function __call($name, $args) { echo "\$name is \"{$name}\"\n"; print_r($args);// 数组无法直接使用echo输出 需要使用print_r输出 echo "\$args[0] is \"{$args[0]}\""; } } $test = new Test(); $test->show("string1","string2");
运行结果:
$name is "show" Array ( [0] => string1 [1] => string2 ) $args[0] is "string1"
简单的说,__call的功能就是这样,但是它具体有什么用呢?最直接的用法就是模拟面向对象的函数重载,php类是不支持像java的多态那样用不同的参数类型、参数数量来表达相同名称的不同函数的,只要名称同名,那么运行的时候就会报错,那么为了实现函数重载(多态),我们就可以利用__call方法实现。具体可以参考我的下一篇博文http://blog.csdn.net/qq_23937195/article/details/73027244
四、使用注意事项
__call在被实现时,必须有两个参数,否则运行后可能会报错,错误格式类似下方:PHP Fatal error: Method Test::__call() must take exactly 2 arguments只有调用的方法不存在时,call方法才会被调用,如果调用的成员方法存在,__call将不会被调用。
只有__call方法被正确定义,当调用的方法不存在时才会调用__call方法,如果__call方法未被定义,你只会在控制台收到如下字符串打头的错误信息
PHP Fatal error: Uncaught Error: Call to undefined method
相关文章推荐
- php的魔术方法__get(),__set(),__call(),__callStatic()以及static延迟静态绑定
- php的魔术方法__get(),__set(),__call(),__callStatic()以及static延迟静态绑定
- php -- 魔术方法 之 调用方法:__call()、__callStatic()
- PHP:魔术方法set和get的深入特性分析
- PHP链接sql2008的链接类以及调用方法
- PHP中的魔术方法总结:__construct,__destruct ,__call,__callStatic,__get,__set,__isset, __unset ,__sleep,__wakeup,__toString,__set_state,__clone,__autoload
- js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
- php学习笔记------[php面向对象中常用关键字与魔术方法]
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload
- PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep
- PHP魔术方法之__call与__callStatic方法
- Struts2.0深入学习 Strust2与Servlet API,Action多方法调用,result标签的type的类型
- dede 调用栏目关键字,描述内容等SEO信息(PHP方法值得学习)
- php魔术方法与魔术变量、内置方法与内置变量的深入分析
- PHP中的魔术方法总结 :__construct,__destruct ,__call,__callStatic,__get,__set,__isset,__unset,__sleep,__wakeup, __toString.......
- PHP魔术方法的简单调用实例
- php魔术方法之_call()
- opencv深入学习(3)-- Mat格式的几个参数以及几种元素存取方法的讨论
- 深入学习PHP数组删除元素方法
- js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析