【问题标题】:PHP Autoloader doesn't find class in the same directory inherited via extendsPHP Autoloader 在通过扩展继承的同一目录中找不到类
【发布时间】:2020-05-20 17:53:44
【问题描述】:

尝试使用自动加载器动态加载我需要使用的类时出现错误。我尝试了一些方法,但都失败了。

我想在设置目录时一定是一些非常愚蠢的错误,但我已经尝试删除或插入相对路径、“使用”等。

我该如何继续?

/admin/index.php 错误

致命错误:未捕获的错误:找不到类“连接” /Applications/XAMPP/xamppfiles/htdocs/common/Class/Database/Sql.php:11 堆栈跟踪:#0 /Applications/XAMPP/xamppfiles/htdocs/common/autoload.php(22): require_once() #1 [内部函数]: {closure}('Database/Sql') #2 /Applications/XAMPP/xamppfiles/htdocs/common/Class/App/Specialty.php(11): spl_autoload_call('Database\Sql') #3 /Applications/XAMPP/xamppfiles/htdocs/common/autoload.php(22): require_once('/Applications/X...') #4【内部函数】: {closure}('App/Specialty') #5 /Applications/XAMPP/xamppfiles/htdocs/admin/index.php(11): spl_autoload_call('App\Specialty') #6 /Applications/XAMPP/xamppfiles/htdocs/index.php(21): include('/Applications/X...') #7 {main} 抛出 /Applications/XAMPP/xamppfiles/htdocs/common/Class/Database/Sql.php 第 11 行

目录结构

- /Common
   - /Class
      - /Database
         - Connection.php
         - Query.php
         - Sql.php
      - /App
         - Specialty.php
      - autoload.php
 - /admin
   - index.php

还有文件……

/admin/index.php

$objTeste = new App\Specialty();
$objTeste->save();

/common/autoload.php

spl_autoload_register(function($className){

    $ds = DIRECTORY_SEPARATOR;
    $dir = __DIR__."/Class";

    $className = str_replace('\\', $ds, $className);

    $file = "{$dir}{$ds}{$className}.php";

    if (is_readable($file)) require_once $file;

});

/common/Class/App/Specialty.php

class Specialty extends Database\Sql
{
    use Database\Query;
    ...
}

/common/Class/Database/Sql.php

class Sql extends Connection
{
    ...
}

/common/Class/Database/Query.php

trait Query
{
    ...
}

/common/Class/Database/Sql.php

class Sql extends Connection
{
    ...
}

/common/Class/Database/Connection.php 类连接 { ... }

一个重要的细节:我在自动加载器中 print_r() 来确定类路径是否生成正确,然后猜猜是什么……它是!

print_r($file);
# /Applications/XAMPP/xamppfiles/htdocs/Common/Class/Database/Connection.php

测试 $file 是否可读

if(is_readable($file)){
    print_r($file." found<br>");
}
else{
    print_r($file." not found<br>");
}

# Result: /Applications/XAMPP/xamppfiles/htdocs/Common/Class/Database/Connection.php found

【问题讨论】:

  • @Jeto 对不起,你是对的。我剪掉了一部分结果,认为它无关紧要。但正确的结果是考虑绝对路径。我现在已经编辑了问题!
  • @Jeto 我尝试使用大写/小写。现在,所有引用都使用大写的类名。同样的错误仍然存​​在。
  • @Jeto nvm,我只是复制/粘贴一个旧的 print_r。但是有一个大写的Class。我试图获取 $path is_readable... 我会用结果编辑问题。
  • 由于您引用Database\Sql 和类似的东西,PHP 将它们(最后一个之前的部分)解释为命名空间。您是否在文件顶部使用任何 namespace 声明?
  • 应该是文件夹结构中Class/ 之后的任何内容。例如。 Connection 应该在 Database 命名空间中,SpecialtyApp 命名空间中等等。

标签: php


【解决方案1】:

由于您在类名中使用反斜杠,PHP 将最后一个之前的所有内容解释为 namespace

例如,当你这样做时:

class Specialty extends Database\Sql

PHP 将其解读为“定义一个类 Specialty,它扩展了 Database 命名空间中的类 Sql”。

因此,要解决您的问题(同时使您的代码更整洁),只需根据文件夹结构中 Class/ 之后的任何内容,在文件顶部添加正确的命名空间声明(因为这是您的根文件夹自动加载器正在使用)。

例如:

namespace Database;

class Sql {
  ...
}

【讨论】:

  • 适用于:命名空间应用程序;类专业扩展 \Database\Sql {
猜你喜欢
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多