php - 命名空间不适用于 php 中的 __autoload 魔法函数

标签 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();

它给出了一个错误:

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



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

最佳答案

您在程序代码中放置了一个命名空间声明,其中放置了 __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有关普遍接受的自动加载程序的详细信息。

关于php - 命名空间不适用于 php 中的 __autoload 魔法函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53654769/

相关文章:

python - 理解 Python 中的 __init__

php - 非常复杂的 php 应用程序的体系结构?

.net - 重新排序 wsdl :definitions in an ASP. NET Web 服务

c# - 为什么在 C# 中与接口(interface)共享命名空间

c# - 公共(public) API 的正确命名空间

php - 如何在 PHP 的开头截断文件?

php - 将 .BAK 文件转换为 .SQL 以在 XAMPP phpmyadmin 中使用

php - 用于连接 MySQL 数据库的 PHP 文件放置的正确位置是什么

php - 如何从mysql数据库中查找与特定月份匹配的所有数据?

api - 如何使用Dart从GraphQL API获取和使用所需的属性?