命名空间和特征

Tom*_*rez 6 php namespaces traits

我使用特征和命名空间时出错,因为无法找到特征.

index.php文件:

require_once 'src/App.php';
use App\main;

$App = new App();
Run Code Online (Sandbox Code Playgroud)

SRC/App.php

namespace App\main;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'DataBase.php';
/**
 * code
 */
Run Code Online (Sandbox Code Playgroud)

SRC/database.php中

namespace App\DataBase;

require_once __DIR__ . DIRECTORY_SEPARATOR . 'Singleton.php';

class DataBase {
  use Singleton; // or use App\Singleton

  /**
   * code
   */
}
Run Code Online (Sandbox Code Playgroud)

SRC/Singleton.php

namespace App\Singleton.php;
trait Singleton {
  /**
   * code
   */
}
Run Code Online (Sandbox Code Playgroud)

但是,当我从Index.php运行它时,我收到此错误:

Fatal error: Trait 'App\DataBase\Singleton' not found in (...)
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

编辑

Php自动在命名空间中设置类名,例如:

Bar.php

namespace App;
class Bar {
  /**
   * code
   */
}
Run Code Online (Sandbox Code Playgroud)

当您调用此包时,可以使用App\Bar,这意味着默认情况下会设置类.

Phi*_*hil 10

您不是在命名空间中导入(或在PHP 用法中使用 -ing)App\Singleton\Singleton符号,App\DataBase因此PHP假定它Singleton位于同一名称空间中.

src/DataBase.php......

namespace App\DataBase;

use App\Singleton\Singleton;

require_once __DIR__ . '/Singleton.php';

class DataBase {
    use Singleton;

    // and so on
Run Code Online (Sandbox Code Playgroud)

此外,我强烈建议您实施自动加载器策略(最好是PSR-0)以避免所有require_once呼叫.

更新

澄清一下,当你这样做时......

namespace App\DataBase;

class DataBase { ... }
Run Code Online (Sandbox Code Playgroud)

这个类的全名是\App\DataBase\DataBase.该namespace声明中不包括类/特性名.