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

时间:2009-10-30 12:04:34

标签: php

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

然后它提供了一个函数来检查你的类并找到一个子类化它的应用程序类并调用“Main”函数的函数。这样你就可以包含头文件,创建一个子类默认应用程序类的类,并确保你提供一个静态的main函数,然后瞧 - 你的应用程序神奇地在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";
    }
}

1 个答案:

答案 0 :(得分:1)

你应该使用类自动加载feauture而不是你的include()来加载它们以避免肮脏的技巧;)