PHP中的特征是否受命名空间的影响?

时间:2013-11-03 05:12:09

标签: php namespaces traits

从PHP文档:

  

只有四种类型的代码受名称空间的影响:类,接口,函数和常量。

但是,在我看来,TRAITS也受到了影响:

namespace FOO;

trait fooFoo {}

namespace BAR;

class baz
{
    use fooFoo; // Fatal error: Trait 'BAR\fooFoo' not found in
}

我错了吗?

4 个答案:

答案 0 :(得分:3)

我认为他们也受到了影响。查看一些评论on the php.net page

第一条评论:

Note that the "use" operator for traits (inside a class) and the "use" operator for namespaces (outside the class) resolve names differently. "use" for namespaces always sees its arguments as absolute (starting at the global namespace):

<?php
namespace Foo\Bar;
use Foo\Test;  // means \Foo\Test - the initial \ is optional
?>

On the other hand, "use" for traits respects the current namespace:

<?php
namespace Foo\Bar;
class SomeClass {
    use Foo\Test;   // means \Foo\Bar\Foo\Test
}
?>

答案 1 :(得分:2)

根据我的经验,如果您粘贴的这段代码驻留在不同的文件/文件夹中,并且您使用spl_autoload_register函数来加载类,则需要执行以下操作:

  //file is in FOO/FooFoo.php
  namespace FOO;
  trait fooFoo {}

  //file is in BAR/baz.php
  namespace BAR;
  class baz
  {
   use \FOO\fooFoo; // note the backslash at the beginning, use must be in the class itself
  }

答案 2 :(得分:1)

是的。

在类外将use导入特征以进行PSR-4自动加载。

然后use在类内部的特征名称。

namespace Example\Controllers;

use Example\Traits\MyTrait;

class Example {
    use MyTrait;

    // Do something
}

或者只是use具有完整名称空间的特征:

namespace Example\Controllers;

class Example {
    use \Example\Traits\MyTrait;

    // Do something
}

答案 3 :(得分:0)

文档中还说“特质类似于班级”, 特质是一类的特例。 因此,适用于类的内容也适用于特征。