浅谈关于Laravel 框架的技术要点

说到PHP的web开发框架,就不得不提到Laravel这一开发框架,它的特点就是简洁清晰,便于处理。要对这一框架有一个清晰的认识,还是要从入口文件开始说起。请求访问的入口文件,主要完成几部分工作,分别是:自动加载函数的添加、服务器实例化与服务注册、路由加载、请求实例化与路由分发、相应生成与发送等等。其中,自动加载函数用于包含引用文件,改文件是composer工具自动生成的,直接require关键字添加即可。

在Laravel框架中一些功能的生成都需要服务容器实现,即IlluminateContainerContainer类的实例,服务容器用于服务注册和解析,也就是说向服务容器注册能够实现某些功能的实例或者回调函数,当需要使用该功能时从服务容器中获取相应的实例来完成。

访问网站的根目录,服务器会调用入口文件进行处理,尚学堂•百战程序员陈老师指出入口文件会通过IlluminateHttpRequest类的静态方法createFormGlobals()实现请求的实例化,然后通过路由进行分发处理,路由会根据请求的地址查找路由表,查找到将通过路由表中对应的相应处理方式进行处理并返回响应。

Illuminatedatabase 组件主要用于操作数据库,他提供了两种数据库的方式,一种是查询构造器方式,一种是Eloqument ORM 方式,通过Eloquent ORM 方式操作数据库需要以下工作:

创建数据库

添加数据库配置信息

启动Eloquent ORM模块

创建model类

通过model类操作数据库

启动Eloquent ORM 模块阶段需要用到数据库的管理类,即IlluminateDatabaseCapsuleManager 类,需要相应初始化,以及数据库相关配置,以完成数据库Eloquent ORM 模块的启动。

在搭建环境的过程中,通过composer工具创建依赖管理时,会在vendor目录下创建一个autoload.php文件和一个composer文件夹,其中composer文件夹中包含了类自动加载函数注册的相关实现,而autoload.php文件是对外的接口,通过包含该文件就可以完成类自动加载函数的注册。(相应问题看源码,没能够有很理解,停留层次较浅)。需要注意的方面有:匿名函数、特殊语法、魔术方法、魔术常量、反射等。

主要用来动态的获取系统中的类、实例对象、方法等语言结构的信息,通过反射API函数可以实现对这些语言构件信息的动态获取和动态操作等(PHP5具有完整的反射API,添加了对类、接口、函数、方法和扩展进行反向工作的能力)在laravel框架中,服务容器解析服务的过程中就用到了反射机制。

在Laravel框架中,解析服务是通过build()函数实现,一般分为两种情况:一种是查找对应的服务是否被服务提供者注册为实例或者提供服务的匿名函数,如果是,则直接进行服务解析;第二种是服务名称没有响应的服务绑定,通过反射机制来动态创建服务。通过反射机制动态创建服务的过程可以分为两个步骤:第一步是通过放射机制获取服务类构造函数的信息,第二步是解决服务类构造函数的依赖问题。判断是否存在构造函数,不存在直接实例化,存在则通过getParameters()来获取输入函数,并有相应的方法解决依赖参数问题,实现依赖注入。

后期静态绑定

同样的相关介绍,在《深入PHP:面向对象、模式与实践》中也有相关介绍,增加了一个后期延迟静态绑定的功能,用于继承范围引用静态调用的类。在类的继承过程中,使用的类不再是当前类,而是调用的类,后期静态延迟绑定使用关键字static来实现,通过这种机制,“static::”不再解析未定义当前方法所在的类,而是在实际运行时计算得到的。即为运行时最初调用的类。

后期延迟绑定还可以用于对象实例中。在对象实例化中static会根据运行时调用的类来决定实例化对象,而self是根据所在位置的类来决定实例化对象。

新特性

trait

单继承语言解决多继承问题方式(Ruby中通过混入类Mixin的方法解决)

通过use 关键字添加到其他类的内部,增加了水平的特性的组合。

trait的一些特质。

优先级:当前类的方式会覆盖trait中的方法,而trait中的方法会覆盖积累的方法

多个trait组合,通过逗号分隔。

冲突解决:结局多个trait中插入了相同的方法,若没有明确解决冲突将会产生一个致命错误,解决该冲突,需要使用insteadof操作符来明确指定使用冲突方法中的哪一个,同时可以使用as操作符将其中一个冲突的方法以另一个名字来引入。

修改方法的访问控制:使用as语法调整方法的访问控制

trait的抽象方法:在trait中可以使用抽象成员

trait的静态成员:可以使用静态方法、静态变量

trait的属性定义:可以定义属性

简化三元运算符

$var = (expr1)?(expr2):(expr3);

从PHP5.3起,可以省略三元运算符的中间部分 $var = expr1 ? :expr3。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180423A0ERG800?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券