• PHP 单一入口框架设计简析


    2013年1月22日 19:35:25

    大概过程:所有URL请求->重定向到index.php->加载一个类A->分析URL得到参数信息和将要调用的另一个类B->加载这个类B,并将参数信息传递给该类->执行->结束.

    入口文件(通过.htaccess文件中的rewrite功能把所有请求都转向这个文件):

    test.php
    
    <?php 
    include './a.php'; //存放处理URL获得参数信息的祖先类A
    
    $objA = new A();
    
    $objA->run();
    
    exit;

    主要入口处理类(相当于zend framework的front,用于处理和分发请求): 

    a.php
    
    <?php
    class A
    {
        public function __construct()
        {
            var_dump('A 构造函数');
        }
        
        public function run()
        {
            include './b.php';
            $obj = new B();
            $obj->action();
        }
        
        public function __destruct()
        {
            var_dump('A 析构函数');
        }
    }

    功能类,处理分发来的请求(超级类将URL分解获得信息,动态new此class,并将信息交给此class处理)

    b.php
    
    <?php
    class B
    {
        public function action()
        {
            var_dump('B action函数');
        }
    }

    如果类B没有继承类A,执行test.php入口文件的代码结果很容易知道:

    string 'A 构造函数' (length=14)
    
    string 'B action函数' (length=14)
    
    string 'A 析构函数' (length=14)

    如果类B继承了主要入口请求处理类A:

    b.php (继承了A)
    
    <?php
    class B extends A
    {
        public function action()
        {
            var_dump('B action函数');
        }
    }

    那么结果是这样的:

    string 'A 构造函数' (length=14)
    
    string 'A 构造函数' (length=14)
    
    string 'B action函数' (length=14)
    
    string 'A 析构函数' (length=14)
    
    string 'A 析构函数' (length=14)

    结论1:如果B继承了A,当在A中创建B的对象那么会再次调用A的构造函数,也只调用A的构造函数

    结论2:如果要想在B中使用A中的数据(往往是对入口URL处理得到的结果),就必须在A的构造函数中定义这些值

    如果在类B中写了B的构造函数会怎样?:

    <?php
    class B extends A
    {
        public function B()
        {
            var_dump('B 构造函数');
        }
        public function action()
        {
            var_dump('B action函数');
        }
    }

    那么结果是这样的:

    string 'A 构造函数' (length=14)
    
    string 'B 构造函数' (length=14)
    
    string 'B action函数' (length=14)
    
    string 'A 析构函数' (length=14)
    
    string 'A 析构函数' (length=14)

    对,和你想的一样,A的构造函数没有执行,因为子类的构造函数覆盖了父类的构造函数

    知道这个结果没有什么可喜可贺的,重要的是:

    结论3:不能写子类的构造函数,否则你别想从父类哪里得到任何动态信息

    结论4:最好将类名和类成员函数名字区分开,避免将类名和方法名写的一样(别笑,这样说不是废话,看下边代码),像zf做的那样,类名后边加上'Controller'后缀,方法名后边加上'Action'后缀

    我想大部分人都这样干过
    
    <?php 
    class index
    {
        public function index()
        {
        
        }
    }

    如果这样套到单一入口框架中就不行了.

    别急,还有:

    结论5:因为每次执行子类B都会执行两次A的构造函数,因此最好将类A设计成单例模式

    ok,木有了.

    Summer PHP 框架

  • 相关阅读:
    计算机安装Fedora操作系统——Win10+Linux双系统
    性能测试——压力测试指标
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    在 数学吧 看到一个 极限题
    东方学帝 和 K歌之王 的 科学观 和 科学方法 的 对比
    走一走 欧拉先生 走过 的 路
    推导一个 经典物理 里 的 黑洞 的 坍缩半径
    四色定理 太简单了 , 来 玩 n 维空间 里 的 x 色定理
    今天看到了一个 求 平面图形 Centroid 的 办法
    记录一下这几天的一些讨论
  • 原文地址:https://www.cnblogs.com/iLoveMyD/p/2872009.html
Copyright © 2020-2023  润新知