2009-10-30 2 views
1

Я пытаюсь сделать немного «фантазии»/«экспериментального» php, чтобы вы могли включить скрипт заголовка (crt0: -p), который определяет базовое приложение класс, который вы можете наследовать.Вызов метода после завершения всей обработки скрипта

Затем он предоставляет функцию, которая проверяет ваши классы и находит тот, который подклассифицирует его класс приложения и вызывает функцию «Главная». Таким образом, вы включаете заголовок, создаете класс, который подклассифицирует класс приложения по умолчанию и гарантирует, что вы предоставляете статическую основную функцию и вуаля - ваше приложение магически захватывает внутри основной функции (подобно java/C# и т. Д. С большим количеством предопределенных функциональность приложения).

Единственная проблема, с которой я столкнулся, - «ждать», пока не будет определен класс приложений пользователей; Поскольку включение, определяющее класс приложения, должно быть выполнено до вашей реализации пользователя, «проверка» также вызывается внутри одного и того же сценария и до того, как пользователь определит их функцию, поэтому не находит класс пользователей, поскольку он еще не определен ,

«Уловка», которую я использовал, была предназначена для запуска приложения внутри функции 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 –

+0

Плюс это выглядит круто: -p –

ответ

1

Вы должны использовать классы автозагрузку Feauture вместо включаемых() для загрузки их избегать грязных трюков;)

Смежные вопросы