理解Flight框架核心

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的Flight类通常用于表示航班信息。这个类可以包含航班号、出发地、目的地、起飞时间、到达时间等信息。在实际应用中,我们可以使用Flight类来管理航班的信息,比如查询航班信息、预订机票、取消航班等。 下面是一个简单的Flight类的示例: ``` public class Flight { private String flightNumber; private String departure; private String destination; private String departureTime; private String arrivalTime; public Flight(String flightNumber, String departure, String destination, String departureTime, String arrivalTime) { this.flightNumber = flightNumber; this.departure = departure; this.destination = destination; this.departureTime = departureTime; this.arrivalTime = arrivalTime; } // getters and setters public String getFlightNumber() { return flightNumber; } public void setFlightNumber(String flightNumber) { this.flightNumber = flightNumber; } public String getDeparture() { return departure; } public void setDeparture(String departure) { this.departure = departure; } public String getDestination() { return destination; } public void setDestination(String destination) { this.destination = destination; } public String getDepartureTime() { return departureTime; } public void setDepartureTime(String departureTime) { this.departureTime = departureTime; } public String getArrivalTime() { return arrivalTime; } public void setArrivalTime(String arrivalTime) { this.arrivalTime = arrivalTime; } } ``` 在这个示例中,Flight类包含了航班号、出发地、目的地、起飞时间、到达时间等信息,并提供了相应的getter和setter方法来获取和设置这些信息。可以根据实际需要对Flight类进行扩展,比如添加舱位信息、票价信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值