zoukankan      html  css  js  c++  java
  • Object之魔术函数__call() 处理错误调用

    在提到__call之前,先来看一个实例的测试结果,以便更好地去了解__call方法的作用。上代码:

    <?php
     class Person{         
            function say(){  
                 echo "Hello, wblog!<br>"; 
             }          
    
     }
    
    $Person=new Person();             
    $Person->run("teacher");      //调用对象中不存在的方法run
    $Person->eat("child", "apple"); //调用对象中不存在的方法eat
    $Person->say();
    ?>
                
    

      运行结果:Fatal error: Call to undefined method Person::run()  on line 35

    我们知道,程序的运行结果抛出了错误提示,在运行的过程中抛出错误后就已经中断了,以致”$Person->say();“这个正确的方法也不能再继续运行。看一下上面的代码就知道,Person类并没有代码错误,错就错在实例化Person类的过程中调用了Person类中并不存在的方法,如run()和eat()。

      在程序的运行中,出现如上抛出的的错误是致命性的,整个程序将崩溃。为了处理这种错误的同时让程序继续执行,我们可以在类中添加一个魔术方法__call,来调用对象中不存在的方法时自动调用该方法,并且使程序可以继续向下执行。

    下面将在上面的代码的基础上多添加一个__call方法并调试,代码如下:

    <?php
      class Person{         
          function say(){  
                       echo "Hello, wblog!<br>"; 
          }          
         function __call($funName, $args) { //声明此方法用来处理调用对象中不存在的方法
            echo "你所调用的函数:".$funName."(参数:" ;  //输出调用不存在的方法名
            print_r($args);                                          //输出调用不存在的方法时的参数列表
            echo ")不存在!<br>
    ";                       
     }
    }
    $Person=new Person();            
    $Person->run("teacher"); //调用对象中不存在的方法,则自动调用对象中的__call()方法
    $Person->eat("child", "apple");             
    $Person->say();
    ?>
                        
    

      

    运行结果:

    你所调用的函数:run(参数:Array ( [0] => teacher ) )不存在!

    你所调用的函数:eat(参数:Array ( [0] => child [1] => apple ) )不存在!

    Hello, wblog!

    这次程序的运行结果不再抛出致命性错误,在调用不存在的方法时自动调用了__call方法捕捉处理不存在的方法并提示给用户,而调用存在的方法时程序正常执行。

    总结:在类中添加一个魔术方法__call,在调用对象中不存在的方法时就会自动调用该方法,并且程序可以继续向下执行。

  • 相关阅读:
    数据结构与算法-字符串与字符串匹配算法
    操作系统-PV操作的原理和几种常见问题
    操作系统-进程(8)-临界区管理
    利用队列实现逐行打印杨辉三角形的前n行
    操作系统-进程(7)死锁和银行家算法
    计算机网络-网络层(6)ICMP协议
    操作系统-进程(6)管程
    计算机网络-链路层(5)点对点链路控制
    操作系统-进程(5)进程通信机制
    RTSP/RTMP流媒体协议网页无插件直播视频平台浏览器请求地址自带尾缀符解释说明
  • 原文地址:https://www.cnblogs.com/jiechn/p/4653620.html
Copyright © 2011-2022 走看看