Php 在所有脚本处理完成后调用方法

Php 在所有脚本处理完成后调用方法,php,Php,我正在尝试做一些“花式”/“实验性”php,这样您就可以包含一个头脚本(称为crt0:-p),它定义了一个可以继承的基本应用程序类 然后,它提供一个函数来检查您的类,并找到一个正在子类化其应用程序类的类,并调用“Main”函数。通过这种方式,您可以包含头,创建一个类,该类对默认应用程序类进行子类化,并确保您提供了一个静态的主函数,瞧,您的应用程序在主函数内部神奇地拾取(类似于java/c#等,具有许多预定义的应用程序功能) 我遇到的唯一问题是“等待”用户应用程序类被定义;因为定义应用程序类的in

我正在尝试做一些“花式”/“实验性”php,这样您就可以包含一个头脚本(称为crt0:-p),它定义了一个可以继承的基本应用程序类

然后,它提供一个函数来检查您的类,并找到一个正在子类化其应用程序类的类,并调用“Main”函数。通过这种方式,您可以包含头,创建一个类,该类对默认应用程序类进行子类化,并确保您提供了一个静态的主函数,瞧,您的应用程序在主函数内部神奇地拾取(类似于java/c#等,具有许多预定义的应用程序功能)

我遇到的唯一问题是“等待”用户应用程序类被定义;因为定义应用程序类的include必须在用户实现之前出现,所以“check”也会在同一个脚本中调用,并且在用户定义其函数之前调用,因此找不到尚未定义的用户类

我使用的“技巧”是让应用程序在register\u shutdown\u函数中运行,然后找到类并运行它;它工作正常,因为此时所有类都已定义,但我不确定系统/脚本/进程在此关闭过程中处于何种状态,以及在此处开始运行代码是否安全:-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";
    }
}

您应该使用类autoloading feauture而不是include()来加载它们,以避免肮脏的把戏;)

应该使用类autoloading feauture而不是include()来加载它们,以避免肮脏的把戏;)

我意识到您可以在主脚本的底部使用MyApplication::Main(),但这样我就可以“围绕”主函数执行额外功能,而不必在每个应用程序中明确定义它:-pI意识到您可以在主脚本的底部使用MyApplication::Main(),但这样我就可以“围绕”执行额外功能主函数不必在每个应用程序中明确定义:-p