专注于WEB技术的IT博客

php面向对象之__call处理错误调用

时间:2013-06-04分类: php浏览:4327
分享到:

在提到__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>\n";                       
            }
                                                  
      }
$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,在调用对象中不存在的方法时就会自动调用该方法,并且程序可以继续向下执行。




猜你喜欢
php面向对象之__autoload()
php面向对象之__toString()
PHP面向对象之const常量修饰符
php面向对象之final的应用
php面向对象之克隆对象
PHP面向对象之对象和引用
php面向对象之类的静态成员
php面向对象之子类中重载父类的方法
php面向对象的访问类型控制
php面向对象编程之类的继承性
标签 : php 面向对象
除非注明,本文首发网志博客,欢迎转载!转载请注明本文地址:http://w3note.com/web/111.html,谢谢。
  • 评论
  • 赞助本站