这是《PHP初体验》内容第后半部分,前半部分请查我们的头条号。
PHP中的反射机制
反射,直观的理解就是根据到达地找到出发地和来源。比如给出一个对象就可以找到对象所属的类、拥有哪些方法。反射可以在PHP运行状态中,扩展分析PHP程序,导出或提取出关于类、方法、属性、参数等的详细信息,这种动态获取信息以及动态调用对象方法的功能称为反射API。
如上代码中介绍的是通过对象获取类的方法和属性字段,而反射不仅仅可以用于类和对象,还可以用于函数、扩展模块、异常等。既然反射可以探知类的内部结构,那么就可以利用反射机制实现插件的功能,也可以利用反射机制实现动态代理。接下来举个简单的例子看看如何通过反射机制实现动态代理。
如上的代码中真正实现sayHello()动作的是Person类中的sayHello()方法,而Dynamicproxy仅是一个代理类,其中并没有定义sayHello()方法,而是通过__call()方法动态调用类Person的sayHello()方法。在DynamicProxy类中可以做sayHello()方法的前后拦截,并且可以动态的改变类中的方法和属性。很多时候,善用反射可以保持代码的优雅和简洁,但反射也会破坏类的封装性,因为反射可以使本不应该暴露的方法或属性被强制暴露了出来。
PHP中的异常和错误
在语言级别通常有许多错误处理模式,但这些模式往往建立在约定俗称的基础上,也就是错误都是可预知的。不同的语言对异常和错误的定义也是不一样的,在PHP中,遇到任何自身错误都会触发一个错误,而不是抛出异常。也就是说PHP一旦遇到非正常代码,通常都会触发错误,而不是抛出异常。因此如果想使用异常处理不可预料的问题,是办不到的。比如,想在文件不存在或数据库无法建立连接时触发异常,是不可行的。PHP会把这些作为错误抛出,而不是作为异常捕获。还是回到PHP的错误处理上,PHP中的错误级别大致分为以下几类:
-
最高级别的错误是语法解析错误 prase error。该错误属于语法检查阶段错误,这会导致PHP代码无法通过语法检查。
-
次之的错误是fetal error。该类错误会导致PHP流程终止,其后的代码无法继续执行。
-
warning是警告级别的错误,在语法中出现很不恰当的情况才会报此错误,如参数不匹配、除数为0等。这种错误会导致不可预期的结果。
-
notice是通知级别的错误,这种错误是在如变量使用前未定义、数组索引是字符时没有加引号等情况。
-
最低级别的错误是deprecated的错误,表示不推荐,不建议。如在PHP5中使用ereg系列的正则匹配函数就会报此类错误,该错误是由于使用了不推荐、过时的函数或语法造成的,不影响PHP正常流程。
接下来我们看一看针对上边介绍的各个级别的错误PHP是如何处理的。PHP中提供了set_error_handler()函数来处理错误,当然该函数也不是可以托管所有种类的错误,如E_ERROR、E_PARSE、E_CORE_ERROR等错误,这些错误会以原始的方式显示。当然也可以通过restore_error_handler()取消接管:
如上这种“曲折迂回”的处理方式也存在问题:必须依靠程序员自己来掌控对异常的处理,对于异常高发区、敏感区,如果处理不好就会出现业务数据不一致的问题,但是优点就是可以获得程序运行的上下文信息,以进行针对性补救。
对于代码中存在的异常,需要认为的进行抛出,接下来我们通过自定义一个异常类来处理抛出的异常,
初体验就为大家介绍到这里吧,以后有机会在深入的去了解PHP函数、PHP与网络、PHP与数据库等等的内容吧。
IT行业最新资讯:
优就业500万阳光就业基金:
http://www.ujiuye.com/zt/jyfc/?wt.bd=fq37300
优就业官网:http://www.ujiuye.com/?wt.bd=fq37300
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-