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 条评论
登录 后参与评论

相关文章

来自专栏web前端教室

大白话-prototype属性

今天来聊聊javascript的prototype, ==========先说结论========= --它是什么呢? 它是一个属性。 --谁的属性? 函数的...

1859
来自专栏有趣的Python

2018.2最新-Scrapy+elasticSearch+Django打造搜索引擎直至部署上线(四)伯乐在线爬取所有文章

最终项目上线演示地址: http://search.mtianyan.cn 第四节:开工啦,开工啦。这节我们爬点数据试试手,并且存起来。存到json,mysql...

4579
来自专栏专注数据中心高性能网络技术研发

[Effective Modern C++(11&14)]Chapter 3: Moving to Modern C++

1956
来自专栏郭少华

(第四季)Vue实例和内置组件

概述:实例就是在构造器外部操作构造器内部的属性选项或者方法,就叫做实例?实例的作用就是给原生的或者其他javascript框架一个融合的接口或者说是机会,让Vu...

521
来自专栏vue学习

24、商品列表页之数据渲染和传值

(1)data中定义一个list对象 (2)将res.data.goodslist赋值给list (3)我们将商品图片、文字描述、价格、折扣等等信息传给子组...

531
来自专栏那些年遇到的坑

使用eventBus事件的重复触发事件问题的解决

在单页应用中,在 A 页面中触发事件,然后在 B 页面中对这个事件进行响应是一个很常见的需求,那么当有这种需求的时候要怎么实现呢。有两种方案可以实现:

1193
来自专栏源哥的专栏

如何在js文件中写加载Applet控件(js与jsp分离技术)

                        如何在js文件中写加载Applet控件(js与jsp分离技术)

654
来自专栏刺客博客

使用sed命令在两行匹配之间插入一行新内容

在这两个之间插入一行liming。 解决办法: 查了一下sed的用法貌似可以试一下,看到命令n可以读入下一行到pattern space,就可一匹配完前一行...

702
来自专栏前端小作坊

原型链上的DOM Attributes

Chrome开发小组最近发表声明他们正在將DOM properties移动到原型链中。这个更新将会在Chrome 43(2015年4月发布beta版本)中实现。...

943
来自专栏精讲JAVA

web.xml 组件加载顺序

在配置项目组件的过程中, 了解Tomcat加载组件顺序很有必要。 例如某些框架如Quartz的集群功能需要数据库的支持, 数据库的加载肯定要在框架组件加载之前。

925

扫描关注云+社区