【问题标题】:Namespaces and traits命名空间和特征
【发布时间】:2014-01-06 23:58:18
【问题描述】:

我在使用特征和命名空间时遇到错误,因为找不到特征。

index.php:

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

$App = new App();

src/App.php

namespace App\main;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'DataBase.php';
/**
 * code
 */

src/DataBase.php

namespace App\DataBase;

require_once __DIR__ . DIRECTORY_SEPARATOR . 'Singleton.php';

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

  /**
   * code
   */
}

src/Singleton.php

namespace App\Singleton.php;
trait Singleton {
  /**
   * code
   */
}

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

Fatal error: Trait 'App\DataBase\Singleton' not found in (...)

我该如何解决?

编辑

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

Bar.php

namespace App;
class Bar {
  /**
   * code
   */
}

在调用这个包的时候,可以使用App\Bar,也就是说类是默认设置的。

【问题讨论】:

  • use App\main in index.php 什么都不做。 App\main 是命名空间,而不是符号名称

标签: php namespaces traits


【解决方案1】:

您没有在App\DataBase 命名空间中导入(或使用-ing)App\Singleton\Singleton 符号,因此 PHP 假定 Singleton 在同一个命名空间中。

src/DataBase.php...

namespace App\DataBase;

use App\Singleton\Singleton;

require_once __DIR__ . '/Singleton.php';

class DataBase {
    use Singleton;

    // and so on

另外,我强烈建议您实施自动加载器策略(最好是 PSR-0)以避免所有 require_once 调用。

更新

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

namespace App\DataBase;

class DataBase { ... }

这个类的全称是\App\DataBase\DataBasenamespace 声明不包括类/特征名称。

【讨论】:

  • 有办法替代这个吗?我想使用 Package\class 而不是 Package\class\class
  • @TomiSebastiánJuárez 他们是你的班级。如果您希望 Singleton 位于 App 命名空间而不是 App/Singleton 命名空间中,则只需更改它即可。 App/DataBase 命名空间中的 DataBase 也是如此。
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多