autoload类映射与composer autoload

时间:2014-05-26 00:25:57

标签: php composer-php autoload

目录:

myproject:
   src:
      MyProject:
           Foo:
              Foo.php

在文件autoload_namespaces.php

return array(
    'MyProject' => array($vendorDir . '/myproject/src'),
);

如果声明如下:

class Bar extends MyProjext\Foo\Foo
{

}

或:

use MyProjext\Foo\Foo;

class Bar extends Foo
{

}

它工作,但我想声明不使用'使用MyProjext \ Foo \ Foo;'或者'扩展MyProjext \ Foo \ Foo'

class Bar extends Foo
{

}

这是错误:'没有找到Foo,有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

你说:

  

它工作,但我想声明不使用'使用MyProjext \ Foo \ Foo;'要么   '扩展MyProjext \ Foo \ Foo'

这意味着这有效:

use MyProject\Foo\Foo;

class Bar extends Foo
{

}

但是这不起作用(你想让它工作):

class Bar extends Foo
{

}

它不起作用,因为类Bar正在尝试从全局范围扩展类Foo,但类FooMyProject\Foo namespace下声明并且它存储在MyProject/Foo目录中,因此错误正在发生,这是合乎逻辑的。

如果您想使用此代码(没有任何namespace):

class Bar extends Foo
{

}

然后确保,类Foo在全局命名空间中可用,并在namespace MyProject\Foo;类声明之前找到类似Foo的行,并删除该行并包含该类Foo之前使用它(通过扩展)来创建类Bar。所以,它看起来像这样:

// You may need to adjust the path
require_once("MyProject/Foo/Foo.php");

class Bar extends Foo
{

}

使用namespace会更好,所以尽量不要使用namespace当前的autoloading技术可能会失败,除非您在不使用namespace的情况下重写它。