【问题标题】:Where is stored namespaced class?命名空间类存储在哪里?
【发布时间】:2015-07-13 05:46:38
【问题描述】:

我有 PHP 命名空间文件

namespace A\B\C
$cls = new foo();

foo 类存储在哪里?

或者如果存在__autoload()如何控制目录映射到命名空间?

感谢您的帮助。我试图更深入地了解目录和命名空间之间的关系。 PHP 和/或 Google 没有给我任何答案。

【问题讨论】:

  • 阅读PSR-4
  • 感谢链接马克。 PSR 这是一个不错的活动。

标签: php namespaces autoload


【解决方案1】:

目录和命名空间之间没有直接关系,除非你使用自动加载器。

如果您希望此代码正常工作:

namespace A\B\C;
$cls = new foo();

你必须这样做:

namespace A\B\C;
class foo {}
$cls = new foo();

或者这样做:

foo.php

namespace \A\B\C;

class foo {}

index.php

require 'foo.php';

$cls = new \A\B\C\foo();
// or
namespace A\B\C;
$cls = new foo();

现在如果你想使用自动加载器,你可以使用这样的东西:

function autoload($class)
{
    $class = str_replace('\\', '/', $class);

    require_once __DIR__ . '/' . $class . '.php';
}
spl_autoload_register('autoload');

把这种代码放在你的 index.php 的顶部,然后得到一个这样的目录:

A
+ B
| + C
| | + foo.php

那么你只需要这样做:

$cls = new \A\B\C\foo();

甚至:

use \A\B\C\foo;
$cls = new foo();

但无论如何,您必须阅读手册:Link here

【讨论】:

  • 谢谢 Bob0t。我已经有红色手册,但我无法抓住核心。你的回答澄清了这一点。据我了解。 PHP 从 NS 声明和类名构建“完整的命名空间名称”。这个全名类似于\A\B\C\foo,其中 foo 是类名。所以 - 当我想加载存储类的文件时 - 我必须将此全名翻译成正确的文件位置,例如。带自动加载。所以必须有 NS 路径和​​文件路径之间的强关系。正确的?现在,当我想实现其他库时,我必须了解 NS 路径是如何映射到文件中的。对吗?
  • 是的,事实上,如果你使用 NS,它基本上是对文件中的类进行排序,例如我总是使用相同的 Core 库,所以它的 NS 是 \Core,所有课程进入目录ROOT . 'Core/' 你看到了吗?在该核心中,我有一些与数据库相关的类,它们位于Core/Database,因此使用的命名空间是\Core\Database。我不知道我是否真的很清楚这一点:/你应该在网上找到很好的视频教程:)
猜你喜欢
  • 2011-01-20
  • 2011-02-10
  • 1970-01-01
  • 2011-10-12
  • 2012-09-25
  • 2011-06-15
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多