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;
}
}
?>
欠点: (開発環境で) エイリアスを使用する場合、これは機能しません。