命名空间无法与PHP中的__autoload magic函数一起使用

时间:2018-12-06 15:35:32

标签: php oop namespaces include magic-function

我创建了一个名为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();

出现错误:

  

严重错误:未捕获的错误:在以下位置找不到类“ MyClassOne \ class_one”   C:\ xampp \ htdocs \ PHP \ autoload \ index.php:9堆栈跟踪:抛出#0 {main}   在第9行的C:\ xampp \ htdocs \ PHP \ autoload \ index.php中

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

2 个答案:

答案 0 :(得分:2)

您要在程序代码中放置一个名称空间声明,这会将__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

答案 1 :(得分:1)

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