PHP面向对象(六)

一、异常处理
  异常(Exception):是一个程序在执行过程中出现的一个例外或是事件,它中断了正常指令的执行,跳转到其他程序模块继续执行,严重会导致丢失数据或者程序崩溃。 

  异常处理:用于在指定的错误发生时改变脚本的正常流程。是PHP5中的一个新的重要特性。异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。

  当异常被触发时,通常会发生:

    1.当前代码状态被保存
    2.代码执行被切换到预定义的异常处理器函数
    3.根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本

  异常处理格式:
    try{
      使用try去包含可能会发生异常的代码.
      一旦出现异常try进行捕获异常,交给catch处理。
      抛出异常语句:throw 异常对象。
    }catch(异常对象参数){
      在这里做异常处理。
    }[catch(...){
      .. .. ..
    }]
  

  异常的规则:
    需要进行异常处理的代码应该放入 try 代码块内,以便捕获潜在的异常。
    每个 try 或 throw 代码块必须至少拥有一个对应的 catch 代码块。
    使用多个 catch 代码块可以捕获不同种类的异常。
    可以在 try 代码块内的 catch 代码块中再次抛出(re-thrown)异常。
    简而言之:如果抛出了异常,就必须捕获它。

 1 <?php
 2     //模拟一个异常抛出和处理
 3         try {
 4             $error = 'Always throw this error';
 5             throw new Exception($error);   
 6             //创建一个异常对象,通过throw语句抛出
 7             echo 'Never executed';         
 8             //从这里开始,try代码块内的代码将不会再被执行
 9         } catch (Exception $e) {
10             echo 'Caught exception: '.$e->getMessage()."<br>";  
11             //输出捕获的异常消息
12         }
13         echo 'Hello World';       //程序没有崩溃继续向下执行
14     ?>

二、自定义异常处理类

  1.系统异常处理:PHP中提供的内置异常处理类Exception是所有异常类的基类,所有系统内置异常处理类或者自定义异常处理类都必须继承这个类。

内置异常处理类Exception的结构:

 1 <?php
 2     class Exception{
 3         protected $message = 'Unknown exception';   // 异常信息  
 4         protected $code = 0;                          // 用户自定义异常代码
 5         protected $file;                              // 发生异常的文件名    
 6         protected $line;                              // 发生异常的代码行号 
 7           
 8         //构造方法
 9         function __construct($message = null$code = 0);    
10 
11         final function getMessage();            // 返回异常信息   
12         final function getCode();               // 返回异常代码    
13         final function getFile();               // 返回发生异常的文件名   
14         final function getLine();               // 返回发生异常的代码行号    
15         final function getTrace();                // backtrace() 数组    
16         final function getTraceAsString();      // 已格成化成字符串的 getTrace() 信息
17             
18         /* 可重载的方法 */   
19         function __toString();                        // 可输出的字符串
20     }
21 ?>

  2.自定义异常处理类

 1 <?php
 2     /* 自定义的一个异常处理类,但必须是扩展内异常处理类的子类 */
 3     class MyException extends Exception{
 4         //重定义构造器使第一个参数 message 变为必须被指定的属性
 5         public function __construct($message, $code=0){
 6             //可以在这里定义一些自己的代码
 7          //建议同时调用 parent::construct()来检查所有的变量是否已被赋值
 8             parent::__construct($message, $code);
 9         }    
10         public function __toString() {        
11           //重写父类方法,自定义字符串输出的样式
12           return __CLASS__.":[".$this->code."]:".$this->message."<br>";
13         }
14         public function customFunction() {    
15              //为这个异常自定义一个处理方法
16              echo "按自定义的方法处理出现的这个类型的异常<br>";
17         }
18     }
19 ?>
 1 <?php
 2    try { //使用自定义的异常类捕获一个异常,并处理异常
 3         $error = '允许抛出这个错误';       
 4         throw new MyException($error);    
 5              //创建一个自定义的异常类对象,通过throw语句抛出
 6         echo 'Never executed'; 
 7             //从这里开始,try代码块内的代码将不会再被执行
 8     } catch (MyException $e) {        //捕获自定义的异常对象
 9         echo '捕获异常: '.$e;        //输出捕获的异常消息
10         $e->customFunction();  //通过自定义的异常对象中的方法处理异常
11     }
12     echo '你好呀';              //程序没有崩溃继续向下执行
13 ?>

三、捕获多个异常
  在try代码之后,必须至少给出一个catch代码块,也可以将多个catch代码块与一个try代码块关联使用。那么使用多个catch就可以捕获不同的类所产生的异常。注意顺序。Exception必须在最后一个catch中,不然其他catch就没有意义。

四、PHP中类与对象的相关函数
============================
Classes/Object 函数
============================
参考手册中--与对象和类有关的扩展函数
1. class_alias — 为类创建一个别名
格式:bool class_alias ([ string $original [, string $alias ]] )
示例:
class foo { }
class_alias('foo', 'bar');

$a = new foo;
$b = new bar;
// the objects are the same
var_dump($a == $b, $a === $b); //bool(true)
var_dump($a instanceof $b); //bool(false)

// the classes are the same
var_dump($a instanceof foo); //bool(true)
var_dump($a instanceof bar); //bool(true)

var_dump($b instanceof foo); //bool(true)
var_dump($b instanceof bar); //bool(true)


*2. class_exists — 检查类是否已定义
格式: bool class_exists ( string $class_name [, bool $autoload ] )
--如果由 class_name 所指的类已经定义,此函数返回 TRUE,否则返回 FALSE。

默认将会尝试调用 __autoload,如果不想让 class_exists() 调用 __autoload,
可以将 autoload 参数设为 FALSE。


3. get_called_class — the "Late Static Binding" class name
(PHP 5 >= 5.3.0) 获取调用者的类名


*4. get_class_methods — 返回由类的方法名组成的数组
格式:array get_class_methods ( mixed $class_name )
返回由 class_name 指定的类中定义的方法名所组成的数组。如果出错,则返回 NULL。

从 PHP 4.0.6 开始,可以指定对象本身来代替 class_name


5. get_class_vars — 返回由类的默认公有属性组成的数组
格式: array get_class_vars ( string $class_name )
返回由类的默认公有属性组成的关联数组,此数组的元素以 varname => value 的形式存在。


*6. get_class — 返回对象的类名
格式: string get_class ([ object $obj ] )
返回对象实例 obj 所属类的名字。如果 obj 不是一个对象则返回 FALSE。


7. get_declared_classes — 返回由已定义类的名字所组成的数组
格式:array get_declared_classes ( void )
返回由当前脚本中已定义类的名字组成的数组。


8. get_declared_interfaces — 返回一个数组包含所有已声明的接口
格式:array get_declared_interfaces ( void )
本函数返回一个数组,其内容是当前脚本中所有已声明的接口的名字。


9. get_object_vars — 返回由对象属性组成的关联数组
格式:array get_object_vars ( object $obj )
返回由 obj 指定的对象中定义的属性组成的关联数组。


10. get_parent_class — 返回对象或类的父类名
格式:string get_parent_class ([ mixed $obj ] )
如果 obj 是对象,则返回对象实例 obj 所属类的父类名。


11. interface_exists — 检查接口是否已被定义
格式:bool interface_exists ( string $interface_name [, bool $autoload ] )
本函数在由 interface_name 给出的接口已定义时返回 TRUE,否则返回 FALSE。


*12. is_a — 如果对象属于该类或该类是此对象的父类则返回 TRUE
我们可以使用运算符: instanceof代替上面的is_a操作

 

原文地址:https://www.cnblogs.com/yexiang520/p/5668592.html