首页 > 解决方案 > 命名空间不能与 php 中的 __autoload 魔术函数一起使用

问题描述

我创建了一个名为命名class_one空间的类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();

它给出了一个错误:

致命错误:未捕获的错误:在 C:\xampp\htdocs\PHP\autoload\index.php:9 中找不到类 'MyClassOne\class_one' 堆栈跟踪:#0 {main} 在 C:\xampp\htdocs\PHP\ 中抛出第 9 行的 autoload\index.php

请帮助我在这段代码中做错了什么?有一个更好的方法吗?

标签: phpoopnamespacesincludemagic-function

解决方案


您在程序代码中放置了一个命名空间声明,它将__autoload()函数放在该命名空间中,使其\MyClassOne\__autoload()而不是所需的\__autoload(),因此 PHP 在尝试加载类时不会触发它。

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

namespace MyClassOne;
class class_one
{
}

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

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

或者使用完整的类名:

$one = new \MyClassOne\class_one();

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


推荐阅读