获取当前插件中的所有功能

时间:2014-03-19 12:42:29

标签: wordpress

有谁知道如何获取当前插件中的所有功能?只有它声明的那些功能?

我知道函数get_defined_functions()并尝试过,但是这个函数获取了所有函数的列表,但我只需要当前的插件。 也许在WP中有一个函数可以获取插件中的所有函数吗?

当然我们可以通过以下方式获取函数的名称,但这不是最好的方法,因为我们的插件可以包含其他文件而我无法获得它们的功能。

$filename = __FILE__;
$matches = array();
preg_match_all('/function\s+(\w*)\s*\(/', file_get_contents($filename), $matches);
$matches = $matches[1];

1 个答案:

答案 0 :(得分:2)

以下代码基于此Q& A's:

这只是一个测试,它将在每个WP页面(前端和后端)中转储所有PHP文件及其功能。代码查找当前插件目录中的所有PHP文件,并搜索每个文件函数。

add_action('plugins_loaded', function() {
    $path = plugin_dir_path( __FILE__ );
    $it = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) );
    foreach ($it as $file) {
        $ext = pathinfo( $file, PATHINFO_EXTENSION );
        if( 'php' === $ext ) {
            echo "<br><br>".$file."<br>";
            $arr = get_defined_functions_in_file( $file );
            var_dump ($arr);
        }
    }
});


/* From https://stackoverflow.com/a/2197870 */
function get_defined_functions_in_file($file) {
    $source = file_get_contents($file);
    $tokens = token_get_all($source);

    $functions = array();
    $nextStringIsFunc = false;
    $inClass = false;
    $bracesCount = 0;

    foreach($tokens as $token) {
        switch($token[0]) {
            case T_CLASS:
                $inClass = true;
                break;
            case T_FUNCTION:
                if(!$inClass) $nextStringIsFunc = true;
                break;

            case T_STRING:
                if($nextStringIsFunc) {
                    $nextStringIsFunc = false;
                    $functions[] = $token[1];
                }
                break;

            // Anonymous functions
            case '(':
            case ';':
                $nextStringIsFunc = false;
                break;

            // Exclude Classes
            case '{':
                if($inClass) $bracesCount++;
                break;

            case '}':
                if($inClass) {
                    $bracesCount--;
                    if($bracesCount === 0) $inClass = false;
                }
                break;
        }
    }

    return $functions;
}