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 警告:在第 4 行的 Foo.php 中,使用非复合名称“Acme”的 use 语句无效

PHP 致命错误:在第 7 行的 Foo.php 中找不到类 'Bar'

我在这里做错了什么?

更新

如果不使用namespace AcmeI use namespace Acme\Barin Bar.php,则会收到与上图相同的错误消息。

4

2 回答 2

1

我发现出了什么问题。问题是遵循标准 PSR-0 的 UniversalClassLoader 类要求具有命名空间的文件不能位于根目录中,并且必须至少在一个目录下创建。

这是代码,以防有人想尝试该示例。

自动加载器.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 回答