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 框架

 

posted @   myD  阅读(5607)  评论(4编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示