【问题标题】:PHP namespaces not workingPHP命名空间不起作用
【发布时间】:2012-09-16 10:20:29
【问题描述】:

我第一次尝试使用 PHP 命名空间,甚至无法获得使用 2 个文件的非常基本的示例。这是我的目录设置:

/框架/
/Framework/index.php
/Framework/Models/TestModel.php

这是两个文件背后的代码。

index.php:

 命名空间框架;

    使用 \Framework\Models\TestModel;

    $model = new TestModel();
    $模型->测试();

TestModel.php:

 命名空间框架\模型;

    类测试模型
    {
        公共功能测试()
        {
            打印(“测试”);
        }
    }

错误只是找不到TestModel类:

致命错误:第 7 行的 C:\xampp\htdocs\Framework\index.php 中找不到类“Framework\Models\TestModel”

我正在通过 localhost/Framework/index.php 的 Web 浏览器运行 PHP。这一定是我没有看到的非常简单的东西,有人可以为我指出吗?

【问题讨论】:

  • 我们需要看看你如何自动加载类...
  • 你还没有加载TestModelrequire_once 'Models/TestModel.php';的文件
  • 如果必须使用 require_once,命名空间有什么意义?
  • @EresDev 使 PHP 比以前更容易混淆一种语言。 (说真的,许多人不喜欢命名空间的实现方式。)也就是说,从技术上讲,当添加大量文件(或包含的长时间更改)时,要避免名称重叠。即使您需要它们 -some-原因,您的特定文件可能只需要少数几个函数和类来完成它的工作。通常它们表明代码库已经变得如此笨拙,以至于没有人完全知道发生了什么,并且它们是防止自己开枪的工具。

标签: php namespaces


【解决方案1】:

文件本身的命名空间与其他类和函数“区分开来”,但是 PHP/Server 不知道物理文件在哪里只是基于命名空间。

因此,正如人们所提到的,直接包含文件可以让 PHP 准确地知道您的意思。

当 PHP 找不到文件时,它会调用函数 spl_autoload_register(),在这个方法中人们通常会放一个小函数来匹配命名空间和目录结构,然后根据目录结构加载文件。

另一种选择是在您的项目中包含 Composer 并使用 PSR-4 自动加载

{
    "require": {
    },
    "autoload": {
        "psr-4": {
            "App\\": "app_directoy/",
            "Framework\\": "framework_directory/",
        }
    }
}

当包含作曲家自动加载时,它将按照您的定义在您的 framework_directory 中查找所有 Framework/*。

【讨论】:

    【解决方案2】:

    您应该在 index.php 中删除 'namespace Framework'include TestModel.php - 像这样:

    require_once('Models/TestModel.php');
    
    use \Framework\Models\TestModel;
    
    $model = new TestModel();
    $model->test();
    

    【讨论】:

    • 这行得通,但如果你必须导入,它似乎破坏了“使用”的意义
    猜你喜欢
    • 2016-09-14
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    相关资源
    最近更新 更多