PHP命名空间错误

时间:2017-07-10 13:18:36

标签: 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;

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')in   第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

我最初使用'使用'索引中的语句如下,但改变了它认为它会有所帮助。

旧的index.php -

use Acme\Tools;

require('autoloader.php');

$hammer = new Tools\Hammer();

有谁知道为什么不工作?

3 个答案:

答案 0 :(得分:2)

您的自动加载器假设完整的类名是类文件的完整路径。您需要在其前面加上类路径的根目录。此示例中的__DIR__假定类路径从运行脚本的位置开始,但您需要更改它以反映正确的路径:

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

这是一个非常原始的自动加载器示例。如果您想使用当前建立的自动加载方法,请对Composer进行一些研究。

答案 1 :(得分:0)

当所有人都在同一个目录时: 剥去整个名称空间

spl_autoload_register(function ($class_name) {
    $file = preg_match('#[^\\](.*)$#', $class_name, $a);
    include $a[1] . '.php';
});
如果将文件放在/acme/Tools/Hammer.php中,

会更有意义

答案 2 :(得分:0)

上面只是@Flosculus答案的一小部分:

/**
 *    our register function :
 *    requires that anything that is 'name spaceable' be in a
 *      php file, one per item.
 *
 *    requires that the directory structure matches EXACTLY (case)
 *      the namespace requirement.
 *
 */

spl_autoload_register(
    function ($name) {
        $name = str_replace("\\" , DIRECTORY_SEPARATOR , $name);
        $fqn  = __DIR__ . "/" . $name . ".php";
        /** @noinspection PhpIncludeInspection */
        require_once $fqn;

    }
);

打破时,这是我在调试会话窗口中得到的

enter image description here