根据 complex857 的建议,我想出了这个解决方案:
我在库的主目录中创建了一个类,为库命名空间设置自动加载。它还确定库位置(假设库和使用它的代码位于同一文档根目录下)。这个类是库用户必须明确包含的唯一一个。它看起来像这样:
<?php
namespace vendor\lib;
class Includer
{
public static $libUrl;
public static $libPath;
public static function getUrl($dir)
{
$url = substr($dir, strlen($_SERVER['DOCUMENT_ROOT'])); // remove root prefix from dir
return str_replace('\\', '/', $url) . '/'; // windows...
}
public static function registerNamespaceAutoload($namespace, $path)
{
// some code to register autoload for given namespace using given path
}
}
// determine library location
Includer::$libUrl = Includer::getUrl(dirname(dirname(__DIR__))); // lib's top level dir (two levels up relative to vendor\lib\Includer)
Includer::$libPath = str_replace('/', DIRECTORY_SEPARATOR, $_SERVER['DOCUMENT_ROOT'] . Includer::$libUrl);
// register autoload for library
Includer::registerNamespaceAutoload('vendor\\lib\\', Includer::$libPath);
?>
用于获取位于 vendor/lib/images/ 中的图像的 URL:
<?php
namespace vendor\lib\images;
use vendor\lib\Includer;
class Image
{
public static function getUrl($fileName)
{
return Includer::$libUrl . 'vendor/lib/images/' . $fileName;
}
}
?>
缺点:这在使用别名时不起作用(在开发环境中)。