PHP單一入口框架設計簡析

myDCool發表於2013-01-22

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

 


相關文章