Вызов метода после завершения всей обработки скрипта - PullRequest
1 голос
/ 30 октября 2009

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

Затем он предоставляет функцию, которая проверяет ваши классы и находит подклассы своего класса приложений и вызывает функцию «Main». Таким образом, вы включаете заголовок, создаете класс, который подклассирует класс приложения по умолчанию, и гарантируете, что вы предоставляете статическую основную функцию и вуаля - ваше приложение волшебным образом подбирает внутри основной функции (подобно 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";
    }
}

1 Ответ

1 голос
/ 30 октября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...