专栏首页决胜机器学习PHP面向对象核心(三)——反射、异常处理

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),作者:linhxx

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    PHP面向对象核心(二) (原创内容,转载请注明来源,谢谢) 三、继承与多态 3.1 继承 1、继承是类级别的复用,关键词为extends;多态是方法级别的复用...

    用户1327360
  • PHP数据结构(二十二) ——快速排序

    PHP数据结构(二十二)——快速排序 (原创内容,转载请注明来源,谢谢) 一、概述 前面的插入排序,都是以移动的方式进行排序。快速排序,则是以交换的方式进行...

    用户1327360
  • 卷积神经网络(五) ——面部验证与神经风格转换

    卷积神经网络(五) ——面部验证与神经风格转换 (原创内容,转载请注明来源,谢谢) 一、概述 本文主要讨论面部验证和神经风格转换两种技术,都是CNN的实际应用。...

    用户1327360
  • Go 语言面向对象教程 —— 通过组合实现类的继承

    Go 语言不是像 PHP 等传统面向编程实现那样通过 extends 关键字来显式定义子类与父类之间的继承关系,而是通过组合方式实现类似功能,显式定义继承关系的...

    学院君
  • 剑指OFFER之二叉树中和为某一值的路径(九度OJ1368)

    题目描述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 输入:...

    用户1154259
  • 【SSH快速进阶】——Hibernate 多对多映射

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

    DannyHoo
  • SpringBoot入门建站全系列(三)Mybatis操作数据库

    Mybatis插件:比较时髦,比较适合sql复杂,或者对性能要求高的应用,因为sql都是自己写的。

    品茗IT
  • 明了 | MongoDB 外键的基本使用

    而在MongoDB中,表示表关系,使用的是嵌套,即,一个文档嵌套一个文档的方法,作为MongoDB的两个文档的关联,以及使用,reference link作为文...

    mySoul
  • SpringBoot使用Redis做缓存结合自带注解

    HUC思梦
  • 关于python单例的常用几种实现方法

    这两天在看自己之前写的代码,所以正好把用过的东西整理一下,单例模式,在日常的代码工作中也是经常被用到,

    coders

扫码关注云+社区

领取腾讯云代金券