10

来自 PHP 文档:

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

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

namespace FOO;

trait fooFoo {}

namespace BAR;

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

我错了吗?

4

4 回答 4

7

对,他们是。

在类外部导入特征以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
}
于 2018-09-30T20:07:31.757 回答
3

我认为他们也受到影响。看看php.net 页面上的一些评论。

第一条评论:

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
}
?>
于 2013-11-03T05:51:44.420 回答
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
  }
于 2014-12-17T14:49:19.110 回答
2

文档还说“A Trait is similar to a class”,A trait 是类的特例。因此,适用于类的内容也适用于特征。

于 2020-10-07T14:48:51.593 回答