PHP面向对象核心(三)——反射、异常处理

PHP面向对象核心(三)

(原创内容,转载请注明来源,谢谢)

五、反射

1、反射即PHP运行过程中,提取出关于类、方法、属性、参数等信息,包括 注释信息。动态获取信息以及动态调用对象方法的功能称为反射API。

2、反射的实现

方法一:采用ReflectionObject类

采用此方法,可以获取到private定义的属性和方法。

示例:

运行结果:

源码:

<?php
class TestReflect{
         public$name;
         private$id;
         publicfunction __construct($name = 'a', $id = 1){
                   $this->name= $name;
                   $this->id= $id;
         }
         privatefunction testFunction(){
                   echo$name.'&'.$id;
         }
         publicfunction testFunction2(){
                   echo$id.'&'.$name;
         }
}
$obj = new TestReflect();
$reflect = new ReflectionObject($obj);
echo '属性:<br />';
$arrProps = $reflect->getProperties();
foreach($arrProps as $item){
         echo$item->getName().'<br />';
}
echo '<br />方法:<br/>';
$arrFuncs = $reflect->getMethods();
foreach($arrFuncs as $item){
         echo$item->getName().'<br />';
}

方法二:采用PHP自带函数

get_class($obj)//返回类名
get_object_vars($obj)//返回对象属性关联数组
get_class_vars(get_class($obj))//返回类属性
get_class_methods(get_class($obj))//返回类的方法

采用方法二,无法从类的外部获取private的属性和方法,需要从类内部定义一个方法去输出这些内容。

3、通过反射,可以还原类的属性和方法,并可在上述foreach中通过isPrivate()、isPublic()、isProtected()、isStatic()等判断类的访问权限。因此,反射可以还原整个类。

4、运用

反射通常用于调试对象,但是消耗太大,善于运用反射可以保证代码的简洁,但是ReflectionObject类可以还原整个类,也破坏了类的封装性。

六、异常与错误处理

1、PHP只有手动抛出异常才能捕获异常,当程序运行中遇到的异常都会报错误。

2、异常的运用

a.对于无法遇见的代码执行结果

b.用于对业务的关注:例如一个方法需要执行将文件上传,并把文件上传路径和文件名存入数据库。这两部缺一不可,否则单个操作没有意义。这种情况下,就可以使用异常,当执行完一步,另一步执行失败时,做出相应的回滚。

c.保证代码的健壮性

3、PHP的错误表示脚本运行不正常。

常见的有deprecated、notice、warning、fetal error、prase等。上述几个优先级呈递增状态。

因此,代码报warning不代表警告,而是报警告级别的错误,也是一种报错。

4、在方法前加入error_reporting(0),可以屏蔽所有的报错,项目部署上线时常用此方法,避免报错导致的数据库等关键信息泄露。

——written by linhxx 2017.06.20

相关阅读:

PHP面向对象核心(二)——继承、多态、接口

PHP面向对象核心(一)——序列化与魔术方法

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-06-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JMCui

Linux 学习记录 四(Bash 和 Shell scirpt).

一、什么是 Shell?        狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,...

4034
来自专栏阮一峰的网络日志

Javascript 严格模式详解

一、概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode)。顾名思义,这种模式使得Javascript在更...

2928
来自专栏电光石火

关于PHP字符编码的函数区别

在以前的学习当中,比方说有一次的写采集过程中转换字符的编码的时候老是失败,转换的结果总没有完全输出,后来经过网络查询得知是iconv有一个“-”漏洞,所以我们有...

2118
来自专栏青玉伏案

设计模式(五): 简单而又不失其重要性的单例模式(Singleton Pattern)

上篇博客我们系统的介绍了三种工厂模式,今天我们就来介绍一下单例模式。单例模式虽然简单,但是还是比较重要的,是常用设计模式之一。在之前的博客《Objective-...

1985
来自专栏博客园

Asp.Net Web API(三)

    在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public方法就被叫做action方法或简单的Action。当We...

1295
来自专栏架构之路

深入探讨 Java 类加载器

看到一篇写得非常好的加载器文章,转过来与大家分享一下(https://www.ibm.com/developerworks/cn/java/j-lo-class...

3384
来自专栏流柯技术学院

Loadrunner中web_find和web_reg_find函数的使用与区别

总结一下Loadrunner中的检查点函数,主要介绍两个函数:web_find()和web_reg_find();这两个函数均用于内容的查找,但两者也有本质的区...

1712
来自专栏angularejs学习篇

页面上通过地址栏传值时出现乱码的两种解决方法

1282
来自专栏黑泽君的专栏

java基础学习_多线程01_多线程_day23总结

662
来自专栏从零开始学自动化测试

python笔记20-获取当前运行函数名

写完代码之后,一般为了方便查看日志,可以在日志输出中加入当前运行的函数名称或类和方法名称,以便于代码报错的时候能快速找到报错的是哪个函数或方法。 那么如何获取当...

1061

扫码关注云+社区