2009-10-30 72 views
1

我正在嘗試做一些「花哨」/「實驗」php,以便您可以包含一個頭文件腳本(稱爲crt0:-p),它定義了一個基本應用程序你可以繼承的類。所有腳本處理完成後調用方法

然後它提供了一個函數,它檢查你的類並找到一個子類化它的應用程序類並調用「Main」函數。通過這種方式,您可以包含頭文件,創建一個類,該類將子類化爲默認的應用程序類,並確保您提供了一個靜態主函數,並且瞧 - 你的應用程序在主函數內部奇蹟般地拾取(類似於java/c#等等,有很多預定義應用程序功能)。

我唯一的問題是「等待」,直到用戶應用程序類被定義爲止;由於定義應用程序類的include必須在用戶實現之前出現,因此在同一個腳本中也會調用「check」,並且在用戶定義它們的函數之前,因此不會查找用戶類,因爲它尚未定義。

我使用的「技巧」是讓應用程序在register_shutdown_function函數中運行,然後找到類並運行它;它工作正常,因爲到目前爲止所有的類已經被定義,但我不確定在關閉過程中系統/腳本/進程處於什麼狀態,以及是否可以在這裏開始運行代碼是安全的:-p。

下面的代碼我有這麼遠的例子:

class Application { 

    static $_instance = null; 

    public static function getInstance(){ 
     if ($this->_instance == null){ 
      $this->_instance = new get_called_class(); 
     } 
     return $this->_instance; 
    } 

} 

function findApplicationClass(){ 
    $classes = get_declared_classes(); 
    foreach ($classes as $class){ 
     $c = new ReflectionClass ($class); 
     if ($c->isSubclassOf("Application") 
     && $c->hasMethod("Main")){ 
      call_user_func($class . '::Main'); 
     } 
    } 
} 

function runApplication(){ 
    findApplicationClass(); 
} 

register_shutdown_function('runApplication'); 

然後將應用程序很簡單:

include "../lib/com/crt0/crt0.php"; 

class MyApplication extends Application { 

    static public function Main (){ 
     echo "Main function"; 
    } 
} 
+0

我意識到你可以使用MyApplication :: Main()到主腳本的底部,但這樣我可以做附加功能「圍繞」主功能,而無需明確定義它在每個應用程序中:-p – 2009-10-30 12:07:15

+0

加上它看起來很酷:-p – 2009-10-30 12:15:30

回答

1

你應該使用類自動裝填feauture,而不是你的include()來加載他們以避免骯髒的技巧;)

相關問題