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

时间:2013-01-29 07:53:00

标签: zend-framework include-path php-include

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

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

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

2 个答案:

答案 0 :(得分:1)

最简单的方法:

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

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

答案 1 :(得分: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;
}

这应该也有些可靠,但文件操作性能昂贵。您可以在性能方面对其进行测试,或者在首次检测后将状态存储在某个位置,这样就不需要在每次请求时运行。