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操作

时间: 2024-12-21 16:23:46

PHP面向对象(六)的相关文章

疯狂java学习笔记之面向对象(六) - 构造器重载、方法重载和方法重写

一.方法重载(Overload): Java允许同一个类中定义多个同名方法,只要形参不一样就可以,如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,则被成为方法重载(两同一异). 同时这这里我们需要注意以下两点:  A.方法重载与返回值类型没有任何关系;  B.方法重载与是否有static修饰没有任何关系. 那我们如何才能确定到底调用的哪个方法呢?  A.主调者:明确是谁在调用这个方法,是类还是对象  B.方法名和形参:确定调用哪个方法(由方法名和形参共同决定) 例1: 1 p

python 面向对象六 类属性和实例属性

一.实例属性 Python是动态语言,根据类创建的实例可以任意绑定属性. 1 >>> class Student(object): 2 ... def __init__(self, name): 3 ... self.name = name # 每个实例必须的属性 4 ... 5 >>> s = Student('Jack') 6 >>> s.score = 90 # 任意绑定属性 7 >>> s.name 8 'Jack' 9 &g

python 面向对象六 动态添加方法 __slots__限制动态添加方法

一.动态添加属性 1 >>> class Student(object): 2 pass 3 4 >>> st = Student() 5 >>> st.name = 'Jack' 6 >>> st.name 7 'Jack' 二.动态给实例添加方法 1 >>> from types import MethodType 2 >>> class Student(object): 3 pass 4 5

面向对象的思想 泛型和委托

面向对象是一种思想,他的技术体现,可以体现在代码中使用泛型,方法与方法之间的调用不是直接调用,而是使用委托. 使用了泛型,就可以不用考虑数据的类型,从而做到统一的处理.就比如我们以前写代码,每个实体类对应一个DAL,然后每个DAL里面都有增删改查的方法,每个方法都是针对固定的类型来做的.如Update实体A,则一定只能更新实体A.但是使用了泛型就可以Update(<T>),这个T是什么类型,只要你指定什么类型,他就是什么类型,T是实体A,就更新实体A,T是实体B就更新实体B. 只要类型不确定,

面向对象的3个要素,5个原则 和 6视点

面向对象三要素 封装(Encapsulation) 继承(Inheritance) 多态(Polymorphism) 面向对象五原则 单一职责原则(SRP) 开放-封闭原则(OCP) Liskov替换原则(LSP) 依赖倒置原则(DIP) 接口隔离原则(ISP) 面向对象六视点 复用(Reusibility) 扩展(Extensibility) 分离(Separability) 变化(Change) 简约(Simplicity) 一致(Coherance) ===================

面向对象的思想 泛型和托付

面向对象是一种思想,他的技术体现,能够体如今代码中使用泛型,方法与方法之间的调用不是直接调用,而是使用托付. 使用了泛型,就能够不用考虑数据的类型,从而做到统一的处理.就比方我们曾经写代码,每一个实体类相应一个DAL,然后每一个DAL里面都有增删改查的方法,每一个方法都是针对固定的类型来做的.如Update实体A,则一定仅仅能更新实体A.可是使用了泛型就能够Update(<T>),这个T是什么类型,仅仅要你指定什么类型,他就是什么类型,T是实体A,就更新实体A,T是实体B就更新实体B. 仅仅要

java面向对象编程(六)--四大特征之继承、方法重载和方法覆盖

一.继承 1.继承的概念 继承可以解决代码复用,让我们的编程更加靠近人类思维.当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过extends语句来声明继承父类.语法如下: class 子类 extends 父类 这样,子类就会自动拥有父类定义的某些属性和方法.另外,并不是父类的所有属性.方法都可以被子类继承.父类的public修饰符的属性和方法,protected修饰符的属性和方法,默认修饰符属

第十六章----面向对象(宠物乱斗之主面板)

学完了面向对象,赵老师让做一个电子宠物,对于我这样的游戏迷来说,就忍不住做一个好玩的小游戏出来,于是,便运用目前所学的知识,经过了大概3到4天的时间,克服了重重困难,无数次修改,不断的修复BUG,不断的实现新的功能,不断的推翻重写,唉,终于做出了一个终极版.在此,记录一下. package com.maya.chongwu; import java.util.Scanner; public class Main { public static String a;/*a,b,c,用来给创建的角色起

sdut 面向对象程序设计上机练习六(类和对象)

面向对象程序设计上机练习六(类和对象) Time Limit: 1000MS Memory limit: 65536K 题目描述 用类成员函数完成5个整型数组元素的输入.从小到大排序.排序后数组元素的输出. 输入 输入5个数组元素. 输出 输出5个数组元素从小到大排序后的结果.(最后一个数后面既没有空格也没有换行) 示例输入 8 9 1 5 4 示例输出 1 4 5 8 9 提示 来源 zlh 示例程序 #include <iostream> using namespace std; //定义