はい、これはやや簡単です:
$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;
}
これもある程度信頼できるはずですが、ファイルアクションはパフォーマンスが高くなります。パフォーマンスに関してテストするか、最初の検出後に状態をどこかに保存して、すべてのリクエストで実行する必要がないようにすることができます。