具体用到这些属性的方法就在ClassLoader类中。
# ClassLoader.php # 一个快速找到文件的算法,很有意思,感兴趣的可以研究下 # 主要通过首字符找到命名空间以及长度,再根据命名空间以及长度找到文件 private function findFileWithExtension($class, $ext) { ...... }那么ClassLoader类属性里面的值是什么时候写入的呢?
答案很简单:当为项目安装组件时,即composer require xxx时,会更新ClassLoader类的属性值,也就是将命名空间和文件地址做一个关联。
接下来看看它的register方法。
# ClassLoader.php public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); }看,其实很简单,就是将loadClass注册到SPL堆栈中。
那么现在就很清楚了,当程序使用了一个还未加载的类时,会调用什么方法?
当然是loadClass方法,再来看看loadClass方法。
# ClassLoader.php public function loadClass($class) { if ($file = $this->findFile($class)) { includeFile($file); return true; } }根据方法的名称就能看出它的功能:1、找到文件 2、加载文件。
总结一下Composer的运行机制:
1、在composer require安装时,更新ClassLoader类的属性 。
2、运行对象时(new \Test()),如果未加载就会执行loadClass(),通过首字符找到命名空间以及长度,再根据命名空间以及长度找到文件,最后include文件。
以上就是Composer的运行机制,接下来,就进入真正的框架搭建了。
二、框架前期准备在正式进入搭建框架之前,先看下整体的架构图以及一些前期准备。
整个架构跟Laravel、ThinkPHP等框架是差不多的,一次请求,一次返回,一个入口,中间根据路由规则交给相应的控制器去执行,在控制器中处理数据以及视图。
接下来做一些前期准备,进入phoenix项目。
# vi index.php 一个入口 ini_set('display_errors', 1); # 显示错误 error_reporting(-1); require_once __DIR__.'/vendor/autoload.php'; # 引入核心加载类 $name = $_GET['name']; dump($name); # dump() composer require symfony/var-dumper # 类似var_dump,输出的变量体验更好些。配置Nginx,访问域名为:?name=SexyPhoenix, 可以正常显示SexyPhoenix。
三、HttpFoundation组件封装Request、Response现有的程序只是一个面向过程的代码,一个简单的请求,响应。
对于搭建web框架,这种痛苦写法当然是要被舍弃的,OOP编程才是正路。
既然要面向对象编程,首先要做的就是对流程中的Request、Response进行封装。而Symfony中专门的组件。
composer require symfony/http-foundationHttpFoundation组件使用说明
改造代码
# index.php ini_set('display_errors', 1); error_reporting(-1); require_once __DIR__.'/vendor/autoload.php'; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; $request = Request::createFromGlobals(); # 创建request对象 $name = $request->get('name', 'World'); # 获取参数,可移入控制器或从模型得到数据 $response = new Response(); $response->setContent('<b>Hello '.$name.'</b>'); # 设置内容,可用view处理 $response->send(); # 返回下面来做一个简单的分析。
$request = Request::createFromGlobals();这一行代码,是相当重要的,它从对象层面上处理了php的全局变量,例如 GET,POST,SESSION......。
这样处理就可以轻易的从request对象中获取所需要的信息以及对请求头等信息的修改。
后期路由这些附加的信息也是存在request的attributes属性中,及其好用。
$response = new Response();通过response对象,可以轻易的控制返回的信息。比如头信息的各种缓存策略......
四、路由处理从架构图上看,接着就要处理路由了。
phoneix框架用了普遍的做法,统一index.php入口。
那么下面要做的就是如何将路由的附加参数和要处理的控制器进行映射。
对于路由一般框架都是通过配置来的,这里也一样做成可配置,方便。
Yaml格式配置路由