【问题标题】:PHP namespaces, I just don't get itPHP 命名空间,我只是不明白
【发布时间】:2013-10-30 12:07:08
【问题描述】:

假设我有一个文件夹,里面有一些文件:

  • 基础设施/核心/Database.php
  • 基础设施/核心/Model.php
  • 基础设施/核心/View.php
  • 基础设施/核心/Controller.php

在每个文件中,我都这样声明了命名空间:

数据库.php

namespace Infrastructure\Core
{
    class Database
    {...}
}

Model.php

namespace Infrastructure\Core
{
    class Model
    {...}
}

等等……

现在我想使用该命名空间中的所有类。想象一下我有以下根文件

index.php

use Infrastructure\Core

class Main
{
    $database = new Database();
    $controller = new Controller();
    //...etc..
}

这几乎就像 java 和 C# 命名空间,但显然在 PHP 中它不起作用......所以以下也不起作用:

index.php

use Infrastructure\Core

class Main
{
    $database = new Infrastructure\Core\Database();
    $controller = new Infrastructure\Core\Controller();
    //...etc..
}

也不起作用,所以我最后想,好吧,我也必须包含文件......仍然不起作用..我做错了什么?我真的没有得到数百万个示例,因为它看起来与我以前使用的任何其他命名空间都大不相同。

谁能提供一个特定于此的示例并使用正确的语法,这样我就可以了解 PHP 的全部内容。我认为这是 php 中的一个稍微不同的概念?

【问题讨论】:

  • “它不起作用”不是对错误的描述
  • 也许是include "../Infrastructure/Core/Database.php"
  • 我没有收到任何错误,对不起,伙计。我正在使用 IIS,如果有错误,不知道如何打开。
  • 尝试使用error_reporting(E_ALL)
  • 啊,所以这应该有效吗? @塞巴斯蒂安

标签: php namespaces


【解决方案1】:

有几点:

  1. 你的类需要被加载,所以你要么根据类名//目录名自己构建一个自动加载器,要么手动包含正确的文件(所以使用include 和/或require

  2. 'use' 只是用于'shortcuts',现在忘了它

  3. 虽然您的命名空间声明是正确的,但您必须从“根”调用它们,因此它们以 \ 开头

    $database = new \Infrastructure\Core\Database();
    

【讨论】:

  • 正确的hangon,我正在试一试,看在上帝的份上,e 报告错误不起作用哈哈。废话。
  • 只需确保您的类已实际加载。如果需要,请尝试将它们全部放在 1 个文件中,然后确定它们已加载。然后从那里去。
  • 那个反斜杠很可能是我的问题.. 虽然现在我意识到 WebMatrix 上没有安装 5.4,只是把它整理出来然后我可以把它打勾为 booyaka shann
  • 静态类呢?是否也可以访问它们:例如:\Infrastructure\Core\Stack::Push("index.php");
  • 命名空间从 5.3 开始工作,所以这也很好。关于静态类:只需将您的命名空间预先添加到类名中。这适用于调用(如静态调用)、回调、字符串(如“is_a()”)等。
【解决方案2】:

命名空间是代码的逻辑分隔符,\ 不一定是文件夹路径。

我已经有一段时间没有使用 PHP 编程了,但我认为您没有使用 include 或其他机制来包含文件内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2011-03-03
    • 2012-10-29
    • 1970-01-01
    相关资源
    最近更新 更多