【问题标题】:Namespace not working with __autoload magic function in php命名空间不能与 php 中的 __autoload 魔术函数一起使用
【发布时间】:2019-05-08 08:22:10
【问题描述】:

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

请帮助我在这段代码中哪里做错了?有没有更好的方法来做到这一点?

【问题讨论】:

  • 根据您存储类文件的位置及其扩展名,它可以像spl_autoload_extensions(".class"); spl_autoload_register(); 一样简单。我更喜欢将我的类文件存储在 Web 根目录之外,并将绝对路径添加到包含路径。让添加和使用新类变得非常简单。
  • 我已将我的课程放在classes 文件夹中并在其外部使用。

标签: php oop namespaces include magic-function


【解决方案1】:

您在程序代码中放置了一个命名空间声明,它将__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

【讨论】:

  • 如果我在顶部use MyClassOne\class_one; 那么我需要包含类文件吗?
  • 现在我收到此错误:-致命错误:未捕获错误:在 C:\xampp\htdocs\PHP\autoload\index.php:13 中找不到类 'MyClassOne\class_one' 堆栈跟踪: #0 {main} 在第 13 行的 C:\xampp\htdocs\PHP\autoload\index.php 中抛出-
  • use 语句只是为长类名注册一个别名。您需要使用include <file> 或注册一个自动加载器来实际加载源代码。请注意,spl_autoload_register() 优先于 __autoload()
【解决方案2】:
spl_autoload_register(function($class) {
    include 'classes/' . str_replace('\\', '/', $class) . '.class.php';
});

【讨论】:

  • __autoload depracted 你将使用 spl_autoload_register 函数
  • 感谢您的回复。我现在使用它会给出错误警告:include(classes/MyClassOne/class_one.php): failed to open stream: No such file or directory in C:\xampp\htdocs\PHP\autoload\index.php on line 8 警告: include():在第 8 行的 C:\xampp\htdocs\PHP\autoload\index.php 中打开 'classes/MyClassOne/class_one.php' 以包含 (include_path='C:\xampp\php\PEAR') 失败/跨度>
  • 是的,我已将课程放在classes 文件夹中。
  • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
猜你喜欢
  • 1970-01-01
  • 2012-04-20
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-23
  • 2020-09-13
  • 2015-03-15
相关资源
最近更新 更多