我正在为WordPress开发一个插件,如果Zend框架可用,它将添加额外的功能,但添加的功能不足以证明用户安装框架(如果它尚不存在)。
我的问题是,有没有什么好方法可以检测Zend是否存在?显然我可以使用get_include_path()
返回包含路径的内容,但除此之外我不确定。我可以使用正则表达式来确定短语zend
是否出现在路径中,但这看起来似乎不可靠(更多地认为误报而不是假阴性,但我认为如果人们没有使用默认路径,那么两者都有可能)。
如果我不得不求助于这个正则表达式,我总是可以捕获错误,并从那里开始,但如果有更好的方法,那么知道这将是有用的。
答案 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;
}
这应该也有些可靠,但文件操作性能昂贵。您可以在性能方面对其进行测试,或者在首次检测后将状态存储在某个位置,这样就不需要在每次请求时运行。