この投稿は、独自の名前空間を追加するために存在すると思われる簡単なソリューション、つまり app/autoload.php のローダーを使用したソリューションに専念しています。
registerNamespace や registerPrefix などのマジック メソッドについて説明しているドキュメントはたくさんあります。
問題は、これらのメソッドが UniversalClassLoader オブジェクトに対して存在することです。
私は Symfony 標準版 2.2 をダウンロードしましたが、app/autoload.php はそれに似ています (Symfony 標準版 2.1 とほとんど同じです):
use Doctrine\Common\Annotations\AnnotationRegistry;
$loader = require __DIR__.'/../vendor/autoload.php';
// intl
if (!function_exists('intl_get_error_code')) {
require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';
}
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
return $loader;
実際に使用されているローダーは composer ローダーです。たとえば、「seclibs/collections」名前空間を追加したい場合に使用できる唯一の方法は、次のような「add」メソッドです。
$loader->add("seculibs\\collections", __DIR__.'/../vendor/seculibs/collections/');
しかし、それはうまくいかないようです:私がプログラムを実行すると、 /seclibs/collections/xx.php に対して同じ classNotFound があります
だから私は autoload.php を次のように変更しました:
require_once ('/../vendor/symfony/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php');
use Doctrine\Common\Annotations\AnnotationRegistry;
use Symfony\Component\ClassLoader\UniversalClassLoader;
$loader = require __DIR__.'/../vendor/autoload.php';
$universalLoader = new UniversalClassLoader();
$universalLoader->registerNamespace("seculibs\\collections", __DIR__.'/../vendor/seculibs/collections/');
$universalLoader->register();
// intl
if (!function_exists('intl_get_error_code')) {
require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';
}
AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
return $loader;
何もない...
しかし、明らかにそれは多くの人にとってうまくいくので..何が間違っているのですか? 秘密のウェブサイトで見つけられる他のバージョンの Symfony はありますか?
クラスの1つはそのようなものです:
namespace seculibs\collections;
class LinkedMap {
private $items;
public function __construct() {
$this->items = array();
}
public function __destruct() {
unset($this->items);
}
....