PHP名称空间错误

PHP名称空间错误,php,Php,首先,我将展示我的代码,为了便于学习,我一直试图保持简单 我的代码 index.php- require('autoloader.php'); $hammer = new Acme\Tools\Hammer(); autoloader.php- spl_autoload_register(function ($class_name) { include $class_name . '.php'; }); Hammer.php- namespace Acme\Tools; clas

首先,我将展示我的代码,为了便于学习,我一直试图保持简单

我的代码

index.php-

require('autoloader.php');

$hammer = new Acme\Tools\Hammer();
autoloader.php-

spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});
Hammer.php-

namespace Acme\Tools;

class Hammer
{

    public function useTool()
    {
        echo 'You start using the hammer!';
    }

}
我的问题/错误消息

警告:include(Acme\Tools\Hammer.php):无法打开流:否 第4行C:\xampp\htdocs\php\autoloader.php中的此类文件或目录

警告:include():为打开“Acme\Tools\Hammer.php”失败 包含(include_path='C:\xampp\php\PEAR')在 第4行的C:\xampp\htdocs\php\autoloader.php

致命错误:未捕获错误:在中找不到类“Acme\Tools\Hammer” C:\xampp\htdocs\php\index.php:5堆栈跟踪:#0{main}抛出 第5行的C:\xampp\htdocs\php\index.php

我最初在索引中使用“use”语句,如下所示,但我改变了它,认为这会有所帮助

old index.php-

use Acme\Tools;

require('autoloader.php');

$hammer = new Tools\Hammer();

有人知道为什么这两个选项都不起作用吗?

您的自动加载程序假定完整的类名是类文件的完整路径。您需要在它前面加上类路径的根目录<代码>\uuuu DIR\uuuu在本例中,假定类路径从脚本运行的位置开始,但您需要更改它以反映正确的路径:

spl_autoload_register(function ($class_name) {
    include __DIR__ . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class_name) . '.php';
});

这是一个非常原始的自动加载器示例。如果要使用当前已建立的自动加载方法,请仔细研究。

您的自动加载程序假定完整的类名是类文件的完整路径。您需要在它前面加上类路径的根目录<代码>\uuuu DIR\uuuu在本例中,假定类路径从脚本运行的位置开始,但您需要更改它以反映正确的路径:

spl_autoload_register(function ($class_name) {
    include __DIR__ . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class_name) . '.php';
});

这是一个非常原始的自动加载器示例。如果要使用当前已建立的自动加载方法,请研究一下。

当所有内容都在同一目录中时: 去掉整个名称空间

spl_autoload_register(function ($class_name) {
    $file = preg_match('#[^\\](.*)$#', $class_name, $a);
    include $a[1] . '.php';
});

如果将文件放在/acme/Tools/Hammer.php中,并且所有文件都位于同一目录中,则更有意义: 去掉整个名称空间

spl_autoload_register(function ($class_name) {
    $file = preg_match('#[^\\](.*)$#', $class_name, $a);
    include $a[1] . '.php';
});

如果您将文件放在/acme/Tools/Hammer.php中会更有意义,这只是上面@Flosculus answer的一个小补充:

中断时,这是我在调试会话窗口中得到的结果


只是上面@Flosculus答案的一个小补充:

中断时,这是我在调试会话窗口中得到的结果



一个短语中有什么不清楚的
没有这样的文件或目录
?你把Hammer.php放在哪里了?@IvoP它都在同一个文件夹中directory@u_mulder我可以阅读,但正如我所说,我不确定错误是什么,我也不熟悉名称空间和自动加载,正如你所想象的,所有内容都在同一个目录中。但我认为它试图自动加载带名称空间的目录。我不知道如何让它拉一个有名称空间的目录。有什么不清楚的短语
没有这样的文件或目录
?你把Hammer.php放在哪里了?@IvoP它都在同一个目录中directory@u_mulder我可以阅读,但正如我所说,我不确定错误是什么,正如你所想象的,我对名称空间和自动加载也很陌生,所有内容都在同一个目录中。但我认为它试图自动加载带名称空间的目录。我不知道如何使它拉一个名称空间的目录。很可能你不需要你已经拥有的代码,当有像Composer这样的现成工具可以更好地处理这个问题时,你就需要自动加载。但是如果我不懂自动加载,为什么我要深入Composer autoloader?@YasminFrench这是一个很好的观点,它更先进,在深入研究它之前,你们需要知道自动加载是如何工作的,因为作曲家有自己的头痛。但这是你前进的目标路径,上面的代码应该可以解决你当前的问题。@Flosculus谢谢,我用过这个,但仍然得到同样的错误。我想它的原因是寻找一个名称空间的目录?我想你可能会这样做,如果你按原样使用的话,但我不知道你的目录结构是什么样子。很可能你不需要你已经拥有的代码,当有像Composer这样的现成工具可以更好地处理这个问题时,你就需要自动加载。但是如果我不懂自动加载,为什么我要深入Composer autoloader?@YasminFrench这是一个很好的观点,它更先进,在深入研究它之前,你们需要知道自动加载是如何工作的,因为作曲家有自己的头痛。但这是你前进的目标路径,上面的代码应该可以解决你当前的问题。@Flosculus谢谢,我用过这个,但仍然得到同样的错误。我认为它的原因是寻找一个名称空间的目录?我想你可能会这样做,如果你按原样使用的话,但我不知道你的目录结构是什么样子。这假设在项目的整个生命周期中,文件结构将是恒定的。也可以将格式良好的include(DIR)设置为off-go。是的,结构将保持不变。否则,您必须相应地更改自动加载器。该函数用于使用某种逻辑查找脚本。名称空间通常是该逻辑的一部分,该逻辑假定在项目的整个生命周期内,文件结构将保持不变。也可以将格式良好的include(DIR)设置为off-go。是的,结构将保持不变。否则,您必须相应地更改自动加载器。该函数用于使用某种逻辑查找脚本。名称空间通常是该逻辑的一部分