php 中的 __autoload 魔法函数无法使用命名空间

Namespace not working with __autoload magic function in php

我创建了一个名为 class_one 的 class,命名空间 MyClassOne,如下所示。

class_one.php

namespace MyClassOne;

class class_one
{
    function __construct()
    {
        echo 'I am from Class One Constructor';
    }
}

我正尝试在 index.php 文件中将其用作:

namespace MyClassOne;
require_once('class_one.php');
$one = new class_one();

它工作正常,但是当我尝试包含 __autoload 魔法函数时:

namespace MyClassOne;
function __autoload($className)
{
    include_once("$className.php");
}

$one = new class_one();

报错:

Fatal error: Uncaught Error: Class 'MyClassOne\class_one' not found in C:\xampp\htdocs\PHP\autoload\index.php:9 Stack trace: #0 {main} thrown in C:\xampp\htdocs\PHP\autoload\index.php on line 9

请帮我看看这段代码哪里做错了?有更好的方法吗?

spl_autoload_register(function($class) {
    include 'classes/' . str_replace('\', '/', $class) . '.class.php';
});

您在程序代码中放置了一个名称空间声明,它将 __autoload() 函数放入该名称空间中,使其成为 \MyClassOne\__autoload() 而不是所需的 \__autoload(),因此 PHP 在尝试加载 class.

时不会触发它

通常,您只需要 class 定义文件中的命名空间声明:

namespace MyClassOne;
class class_one
{
}

然后在你的程序代码中使用use

use MyClassOne\class_one;
$one = new class_one();

或使用完整的 class 名称:

$one = new \MyClassOne\class_one();

有关普遍接受的自动加载程序的详细信息,请参见PSR-4