Я пытаюсь сделать немного "необычного" / "экспериментального" 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";
}
}