一、什么是魔术方法?

魔术方法是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
阅读更多

魔术方法以及__call的调用的更多相关文章

  1. PHP面向对象魔术方法之__call函数

    l 基本介绍: (1) 当我们调了一个不可以访问的成员方法时,__call魔术方法就会被调用. (2) 不可以访问的成员方法的是指(1. 该成员方法不存在, 2. 成员方法是protected或者 p ...

  2. PHP常用魔术方法(__call魔术方法:)

    魔术方法  __call <?php //文件名:index.php define('a',__DIR__); include '/IMooc/Loader.php'; spl_autoload ...

  3. 魔术方法之__call与__callStatic方法

    <?php class human{ private function t(){ } /** * 魔术方法__call * * @param string $method 获得方法名 * @pa ...

  4. PHP魔术方法之__call与__callStatic方法

    <?php class human{ private function t(){ } //魔术方法__call /* $method 获得方法名 $arg 获得方法的参数集合 */ public ...

  5. 魔术方法之__call、__callStatic

    1.__call() 作用,当调用不存在的方法时,会调用该方法.实际应用,当程序调用不存在的方法时,意外导致程序终止. .或者当你调用了受保护的或者是私人的方法时,也会自动调用__call方法 结果: ...

  6. php类知识---魔术方法__toString,__call,__debugInfo

    <?php class mycoach{ public function __construct($name,$age) { $this->name = $name; $this-> ...

  7. PHP中的常用魔术方法

    魔术方法: 是指某些情况下,会自动调用的方法,称为魔术方法 php面向对象中,提供了这几个魔术方法,他们的特点都是 以双下划线__开头的 __construct()  构造方法 __destruct( ...

  8. php中常用魔术方法的举例

    魔术方法是php面向对象特有的功能,并且有时候能实现意想不到的效果,包括前面提到的构造函数.析构函数.还有__clone函数,另外再简单的介绍几个: 1.__toSring和__invoke clas ...

  9. php魔术方法的使用

    本文测试环境为 php5.5.12 一.__get .__set 将对象的属性进行接管. 一般来说,总是把类的属性定义为private,但是对属性的读取和赋值操作非常频繁,在php5+,预定义__se ...

随机推荐

  1. IOS开发 警告 All interface orientations must be supported unless the app requires full screen.

    在IOS开发中遇到警告  All interface orientations must be supported unless the app requires full screen. 只要勾上R ...

  2. UNIX环境高级编程 文件I/O

    大多数文件I/O 只需要用到 5个函数 :    open , read , write , lseek , close 本章描述的都是不带缓冲的I/O(read write 都调用内核中的一个系统调 ...

  3. vue-router(二)后代路由

    关键字:router,children ,router-link,router-view,router-link-active 先理解什么是children? 后代路由为某路由中用到router-vi ...

  4. C++ 项目经验总结:程序严谨性(一)

    作者:JK 时间:2015/09/24 特别说明:版权所有,转载请注明出处: 最近笔者在参与项目时,遇到了一些很奇特的问题,程序运行正常,产生的结果异常,程序功能是对当天的数据进行统计,数据里有可能有 ...

  5. WebStorm的主题与设置

    1.  Webstorm主题风格选择 2.  Webstorm字体字号配置 3.  Webstorm快捷键的查找 4.  Webstorm插件的安装

  6. BZOJ4561 JLoi2016 圆的异或并 【扫描线】【set】*

    BZOJ4561 JLoi2016 圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区 ...

  7. 《DSP using MATLAB》示例Example7.14

    代码: M = 20; alpha = (M-1)/2; l = 0:M-1; wl = (2*pi/M)*l; Hrs = [1, 1, 1, zeros(1, 15), 1, 1]; % Idea ...

  8. 《DSP using MATLAB》示例Example7.2

  9. python 打印对象所有属性值

    from pprint import pprint pprint (vars(your_object)) 另外查看所有属性名用.__dict__

  10. modelsim仿真常用系统函数

    (1)$time 作用:返回所在模块的仿真时间,可以查看信号的出现的时间,用来把握信号的时序. 如:$display(''the time is %t'',$time) ;//显示当时的时间 (2)$ ...