0

我正在为 WordPress 开发一个插件,如果 Zend 框架可用,它将添加额外的功能,但是如果它不存在,添加的功能不足以证明用户安装框架是合理的。

我的问题是,有什么好方法可以检测 Zend 是否存在?显然,我可以get_include_path()用来返回包含路径的任何内容,但除此之外我不确定。我可以使用正则表达式来确定该短语是否zend出现在路径中,但这似乎充其量是不可靠的(更多地认为误报而不是误报,但我认为如果人们没有使用默认路径,两者都有可能)。

如果我不得不求助于这个正则表达式,我总是可以在错误出现并从那里继续时捕获它们,但如果有更好的方法,那么知道这将是有用的。

4

2 回答 2

1

最简单的方法:

if (stream_resolve_include_path('Zend/Version.php')) {
    // ZF found
}

但我会质疑你为什么需要这样做。如果你的插件需要被编码才能在没有框架的情况下工作,如果它在那里,你会通过使用它获得什么?似乎这只会使您的代码复杂化。

于 2013-01-29T09:39:20.507 回答
0

是的,这有点容易:

$zfPresent = (bool) stream_resolve_include_path("Zend/Application.php")

如果可以在包含路径中找到该文件,stream_resolve_include_path()将返回它的绝对路径 - 如果不是,它将返回 false。

因此,如果找到该框架,肯定就在那里。

对某些人来说只是一粒盐:它至少需要 PHP 5.3.2

见: http: //php.net/manual/de/function.stream-resolve-include-path.php

如果 PHP 版本不允许您使用上述解决方案:

尝试这样的事情:

set_error_handler(function($code, $text, $file, $line) {
    // Handle zend not present    

    /* So that internal error handling won't be executed */
    return true;
});

include("Zend/Application.php");

restore_error_handler();

我不认为它真的很优雅,但它在检测 Zend 方面应该有点可靠。另一种方式可能是这样的:

function checkForZf()
{
    $includePaths = array_merge(explode(PATH_SEPARATOR, get_include_path(), array($myAppsLib));

    foreach($includePaths as $path) {
        if (file_exists($path . DIRECTORY_SEPARATOR . 'Zend' . DIRECTORY_SEPARATOR . 'Application.php') {
            return true;
        }
    }
    return false;
}

这也应该有点可靠,但文件操作的性能代价很高。您可以在第一次检测后测试它的性能或将状态存储在某处,因此它不需要在每个请求上运行。

于 2013-01-29T08:26:12.207 回答