【发布时间】: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命名空间中,Specialty在App命名空间中等等。
标签: php