Flight框架(官网)是一个微型的PHP框架,它简单,快速,可扩展。借助Flight可以快捷而轻松的创建你的RESTFul web应用。
虽然是一个微型的框架,而且代码量确实也较少,但我在阅读Flight代码的过程中,感到了它设计和构思独特而精妙的地方,觉得有学习的价值,便决定做一下整理分享出来。
如果你对框架还不熟悉,可以先去官网看下文档,如果需要中文文档的话可以可以点这里。
如果你已经对Flight有一定了解了,接下来就来看看Flight是怎么工作的吧。
<?php
class Flight {
/**
* Framework engine.
* @var object
*/
private static $engine;
// Don't allow object instantiation
private function __construct() {}
private function __destruct() {}
private function __clone() {}
/**
* 之前已经看到了,框架内所有函数都是以Flight类的静态函数形式调用的
* __callStatic()这个魔术方法能处理所有的静态函数
* @param string $name Method name
* @param array $params Method parameters
* @return mixed Callback results
*/
public static function __callStatic($name, $params) {
static $initialized = false;
if (!$initialized) {
//这里定义框架的自动加载机制,实际上是依据PSR-0标准来做的
require_once __DIR__.'/autoload.php';
//Engine类是框架的引擎所在
self::$engine = new \flight\Engine();
$initialized = true;
}
//在这里,Flight对Engine包装了一层而已。对Flight类静态函数的调用,实质上是对Engine类的相应函数的调用
return \flight\core\Dispatcher::invokeMethod(array(self::$engine, $name), $params);
}
}
//那么就直接就来看看Dispatcher::invokeMethod函数吧
namespace flight\core;
class Dispatcher {
/**
* 调用一个方法
* @param mixed $func Class method
* @param array $params Class method parameters
* @return mixed Function results
*/
public static function invokeMethod($func, array &$params = array()) {
list($class, $method) = $func;
$instance = is_object($class);
switch (count($params)) {
case 0:
return ($instance) ?
$class->$method() :
$class::$method();
case 1:
return ($instance) ?
$class->$method($params[0]) :
$class::$method($params[0]);
case 2:
return ($instance) ?
$class->$method($params[0], $params[1]) :
$class::$method($params[0], $params[1]);
case 3:
return ($instance) ?
$class->$method($params[0], $params[1], $params[2]) :
$class::$method($params[0], $params[1], $params[2]);
case 4:
return ($instance) ?
$class->$method($params[0], $params[1], $params[2], $params[3]) :
$class::$method($params[0], $params[1], $params[2], $params[3]);
case 5:
return ($instance) ?
$class->$method($params[0], $params[1], $params[2], $params[3], $params[4]) :
$class::$method($params[0], $params[1], $params[2], $params[3], $params[4]);
default:
return call_user_func_array($func, $params);
}
}
}
上面注释里提到了,自动加载和PSR-0,我之前写过一篇关于这部分内容的文章。Flight框架的自动加载就是基于namespace和psr-0标准的:
//只列出有关自动加载部分的主要代码
namespace flight\core;
class Loader {
/**
* Starts/stops autoloader.
*
* @param bool $enabled Enable/disable autoloading
* @param mixed $dirs Autoload directories
*/
public static function autoload($enabled = true, $dirs = array()) {
if ($enabled