php - 不能对自动加载器使用命名空间

标签 php namespaces autoloader php-7.3

使用自动加载器“spl_autoload_register”时,我无法使用命名空间实例化类。如果不使用命名空间,或者简单地排除自动加载器,它可以很好地访问类方法。我故意省略了第一个类的命名空间以显示错误。所有文件都在同一文件夹中运行。

错误的潜在原因:

由于命名空间在没有自动加载器的情况下工作,我怀疑自动加载器从实例化中添加了命名空间路径的反斜杠。如果是这样,这可能是找不到该类的原因。

观察:

自动加载加载类没有错误。如果在实例化期间不使用命名空间路径,则可以访问类方法。如果包含没有自动加载的类,则可以使用命名空间实例化 Class_2。

如果我注释掉 Class_2 的实例化,那么我会得到以下没有错误的信息:

Hello from class 1

错误信息:
Hello from class 1PHP Fatal error:  Uncaught Error: Class 'Area_2\Class_2' not found in Xxx/run.php:9

自动加载器:
spl_autoload_register(
    function ($class_name) {

      $directories = ['./'];
      $extension   = ".class.php";

      foreach ( $directories as $dir) {
        if (file_exists($dir . $class_name . $extension)) {
            require_once($dir . $class_name . $extension);
            return;
        }
      }
    }
);

运行文件:
include 'autoloader.php';

$class_1 = new Class_1();
$class_1->print_1();


$class_2 = new \Area_2\Class_2(); // Error by using namespace.
$class_2->print_2();

Class_1:
class Class_1 {

  public function print_1()
  {
    echo "Hello from class 1";
  }

}

Class_2:
namespace Area_2;

class Class_2 {

  public function print_2()
  {
    echo "Hello from class 2";
  }

}

最佳答案

您的自动加载器为任何使用命名空间的类假设了一个基于目录的系统,即使它不是故意的。原因是命名空间分隔符与目录分隔符相同(或相似到系统会自动在两者之间进行转换)。

当你这样做时:
file_exists($dir . $class_name . $extension)
使用类 Area_2\Class_2 , PHP 将其转换为 ./Area_2\Class_2.class.php .

因此,您的代码需要文件夹。

关于php - 不能对自动加载器使用命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62025473/

相关文章:

php - 使用 htaccess 从 URL 中删除最后一个目录

c++ - 错误 : 'cout' : undeclared identifier; though I've included iostream header file in program

php - Laravel 路由缓存

php - 在自动加载和命名空间方面遇到问题,有人能发现是什么让我烦恼吗?

php - (codeigniter/Neo4j) PHP : namespace and autoloader

php - 联合条件查询

javascript - 使用 AJAX 将数据从 PHP 返回到 JavaScript - 数据类型错误?

基于页面 url 的 PHP & Magento If 语句

php - 使用命名空间并包含一个库

c++ - 用户声明的命名空间成员