array_merge(array_merge php)

zhangyang 2022-05-10 阅读:15
  

  作为一个中国人开发的PHP框架。现已更新至TP6。不过对于TP6的到来,在底层上与TP5有所不同,后续我会继续分享框架底层。

  异常机制大家在项目都会使用到,但对于框架的异常原理你知道吗? 以及框架里面有错误但是它就是不抛出来,直接500服务错误。如何解决呢?

一、TP6异常有那些类型

   TP6对PHP版本是7.1.0

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  因此,框架底部的异常捕获继承了Throwable错误异常接口。所以整个框架都是基于这个接口。有些朋友可能会说,Exception不是用于一般的异常捕获吗?为什么是Throwable?

  那是因为Exception类是实现了Throwable接口,从而来方面我们调用。接口如果不实现它有用吗?实现流程:TP框架的Exception类继承PHP底层Exception类,底层类再去实现Throwable接口

  注:Throwable可参加上一篇文章PHP 7错误异常

  TP6共有8个异常类型,位于vendor\topthink\framework\src\think\exception下面:.

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  分别是:错误异常、文件异常、系统异常、HTTP异常、HTTP响应异常、非法数据异常、路由异常和数据校验异常。

  ErrorException是一个error exception,这也是PHP之类的语法错误框架能够被捕获的原因。

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  而常用的异常类抛出异常,它会实现PHP底层的ErrorException类,和ErrorException一样也会实现Exception基类。而所以大家可以把它理解为应用逻辑操纵的基类。,如Http,Route,Valide,都会继承PHP底层的RuntimeException。

  RuntimeException将继承Exception.

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  RuntimeException类的继承

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  常用的方法如getMessage、getFile都来自我们的Throwable接口。

idth="1416" img_height="876" alt="TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享" >

  

二、异常捕获的原理解析

  TP6框架有2中方式,分为手动与自动捕获。手动捕获异常是基于try-catch结构来进行捕获。例如:

try { echo 44; throw new Exception('我是手动抛出来的');} catch (\Exception $e) { // 这是进行异常捕获 return json($e->getMessage());}//执行结果:44"我是手动抛出来的"

  注意:PHP异常是不抛出不执行的,这里的手动抛出是指,当我们throw抛出后。它会在下面的Catch里面进行捕获。而不是说你都不 throw new Exception对象。就可以在下面捕获到异常

  抛出异常就是去执行 了tp的定义的Exception类,也就是我们在框架目录下面的vendor\topthink\framework\src\think\Exception.php类

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  那自动是怎么实现的呢?

  自动实现是我们再去启动框架的时候会把它自动的注入到容器里面并绑定关系的。一开始是没有,当运行后就会绑定起来。

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  

绑定后的关系,array_merge是合并多个数组为一个。如果有多个关系就合并用一个来绑定。最终就有think\exception\Handle=>app\ExceptionHandle 的关系

  这也是为什么TP6已经默认实现其全局的自动异常类,你可以不用再去实现了。而这个实现的类就是app\ExceptionHandle类库。也就是框架里面绑定的服务实例都会在框架载入的来启动。

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  那这个自动方式 也需要调用方法啊?你不调用怎么执行呢?

  当我们绑定实例化关系后,然后再绑定实例给容器后,我们就会去执行HTTP请求,它就是HTTP下面去捕获我们异常的。

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  看到了吗?,当我们去执行请求的时候,如果有异常抛出,那就会被Throwable接口管理到。接口的触发就是在于类库去实现了接口的,这个 比较好理解。然后我们就会调用前面注册到容器里面的Handle::class--->report()方法

三、框架应用错误不抛出的解决方案

  框架应用的错误不抛出是在于框架默认只是去捕获HTTP请求的处理,而不会作用于应用。所以如果是你应用下面出现问题,它是抛不出来,这个大家后面写代码的时候一定要去注意到,不然到时候就尴尬了

  例如:配置文件Log.php有语法错误,但是你去访问方法的时候就直接报500,而不是抛出异常,如果你的应用配置接口不对也是一样的

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  那这个是怎么造成的呢?

  这个是因为在我们去执行请求实现自动抛出的时候,需要在容器里面去反转实例,当我们的错误应用错误的时候,我们就会进行Error的错误注册机制里面去捕获,它 不是属于普通错误异常捕获机制。而在应用错误捕获,我们是把错误信息打印到控制台上,所以它不会输出到我们浏览器上面

TP6异常捕获机制,HTTP请求异常原理解析,常见问题分享

  如何解决:大家可以用debug来调试下,就可以看到他直接打印到控制台上

  希望大家有收获,对于框架源码解析。我会不定期更新。大家可以留言或者关注发私信。我会根据大家意见来更新技术文章。

  年轻就要折腾

评论(0)

二维码