我试图建立一个简单的示例,以了解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 Acme,而是在Bar.php中使用namespace Acme\Bar,那么我得到的错误消息与上面所示的相同。
发布于 2012-10-23 06:07:55
我发现了出了什么问题。问题是,遵循标准PSR-0的UniversalClassLoader类要求具有名称空间的文件不能位于根目录中,必须在至少一个目录下创建。
这是代码,以防有人想要尝试这个例子。
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-20 20:40:53
您不能使用整个命名空间,只能使用tu使用Acme\Bar。
https://stackoverflow.com/questions/12992448
复制相似问题