1

SymfonyのClassLoaderコンポーネントと新しいPSR-0標準がどのように機能するかを理解するために、簡単な例を設定しようとしています。

最初にBar.phpを作成しました:

namespace Acme;

class Bar 
{
    // Implementation
    public static function helloWorld() {
        echo "Hello world!";
    }
}

次に、autoloader.phpを作成しました(ベンダーパスの下にClassLoaderコンポーネントがあります)。

require_once __DIR__.'/vendor/symfony/class-loader/Symfony/Component/ClassLoader/UniversalClassLoader.php';

use Symfony\Component\ClassLoader\UniversalClassLoader;

$loader = new UniversalClassLoader();
$loader->register();

$loader->registerNamespace('Acme', __DIR__);

最後に、Foo.phpを作成しました。

require_once 'autoloader.php';

use Acme;

class Foo extends Bar
{
    // Implementation
}

$foo = new Foo();
$foo::helloWorld();

しかし、私が実行すると:

$ php Foo.php

次のエラーメッセージが表示されます。

PHP警告:非複合名「Acme」のuseステートメントは、4行目のFoo.phpでは効果がありません。

PHPの致命的なエラー:7行目のFoo.phpにクラス「Bar」が見つかりません

私はここで何が間違っているのですか?

更新

を使用する代わりに、をnamespace Acme使用するnamespace Acme\BarBar.php、上記と同じエラーメッセージが表示されます。

4

2 に答える 2

1

私は何が間違っていたのかを発見しました。問題は、標準の PSR-0 に従う UniversalClassLoader クラスでは、名前空間を持つファイルをルート ディレクトリに置くことができず、少なくとも 1 つのディレクトリの下に作成する必要があることでした。

誰かが例を試してみたい場合のコードを次に示します。

autoloader.php

require_once __DIR__.'/vendor/Symfony/Component/ClassLoader/UniversalClassLoader.php';
$loader = new Symfony\Component\ClassLoader\UniversalClassLoader();
$loader->registerNamespaces(array('Acme' => __DIR__ . '/src'));
$loader->register();

./src/Acme/Bar.php

namespace Acme;

class Bar 
{
    // Implementation
    public static function helloWorld() {
        echo "Hello world!";
    }
}

./src/Acme/Foo.php

namespace Acme;

require_once '../../autoloader.php';

use Acme\Bar;

class Foo extends Bar
{
    // Implementation
}

$foo = new Foo();
$foo::helloWorld();
于 2012-10-23T06:07:55.147 に答える
0

名前空間全体を使用することはできません。Acme\Bar を使用する必要があります。

于 2012-10-20T20:40:53.657 に答える