Zend framework 我可以在include路径中动态检测Zend框架吗?

Zend framework 我可以在include路径中动态检测Zend框架吗?,zend-framework,include-path,php-include,Zend Framework,Include Path,Php Include,我正在为WordPress开发一个插件,如果Zend框架可用,它将添加额外的功能,但是如果Zend框架不存在,那么添加的功能还不足以让用户安装该框架 我的问题是,有没有好的方法来检测Zend是否存在?显然,我可以使用get\u include\u path()返回include路径是什么,但除此之外,我不确定。我可以使用正则表达式来确定短语zend是否出现在路径中,但这似乎是不可靠的(考虑的误报多于误报,但我认为如果人们没有使用默认路径,两者都有潜力) 如果我必须使用这个正则表达式,我总是可以在

我正在为WordPress开发一个插件,如果Zend框架可用,它将添加额外的功能,但是如果Zend框架不存在,那么添加的功能还不足以让用户安装该框架

我的问题是,有没有好的方法来检测Zend是否存在?显然,我可以使用
get\u include\u path()
返回include路径是什么,但除此之外,我不确定。我可以使用正则表达式来确定短语
zend
是否出现在路径中,但这似乎是不可靠的(考虑的误报多于误报,但我认为如果人们没有使用默认路径,两者都有潜力)


如果我必须使用这个正则表达式,我总是可以在错误出现时捕获错误并从中继续,但是如果有更好的方法,那么知道它会很有用。

是的,这有点容易:

$zfPresent = (bool) stream_resolve_include_path("Zend/Application.php")
如果文件可以在包含路径中找到,则
stream\u resolve\u include\u path()
将返回其绝对路径,否则将返回false

因此,如果它被发现,框架肯定就在那里

对于某些人来说,这只是一种假设:它至少需要PHP5.3.2

见:

如果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;
}
这在某种程度上也应该是可靠的,但文件操作的性能很昂贵。您可以测试它的性能,或者在第一次检测后将状态存储在某个位置,这样它就不需要在每个请求上运行。

最简单的方法:

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

但我想问你为什么要这么做。如果你的插件需要编码才能在没有框架的情况下工作,那么如果它存在,你使用它会得到什么好处?看来这会使你的代码复杂化。

谢谢你,蒂姆。该代码将在任何系统上提供基本功能,但如果该选项存在,它将增强自身功能。这没什么大不了的,但是添加的工作(设置zend标志并检查执行情况)不会给代码增加任何真正的复杂性,只有一个if/else。正如我所说,这是次要的。应该提到这至少需要PHP5.3.2,所以您可以将其添加到插件的需求文档中;)