PHP 自动加载 class 未找到
PHP autoload class not found
我在使用 PHP 自动加载特定 class 时遇到问题,它一直说找不到它。
错误:
Warning: require_once(Models/BaseModel.php): failed to open stream: No such file or directory in /var/www/html/icompare/init.php on line 29
Fatal error: require_once(): Failed opening required 'Models/BaseModel.php' (include_path='.:/usr/share/php:/var/www/html/icompare/lib') in /var/www/html/icompare/init.php on line 29
我的自动加载是如何在 init.php
中启动的:
set_include_path(get_include_path().PATH_SEPARATOR.APP_ROOT_PATH.DIRECTORY_SEPARATOR.'lib');
spl_autoload_extensions(".php");
spl_autoload_register(function($className){
$className = str_replace('\', DIRECTORY_SEPARATOR, $className);
$file = $className.".php";
// echo 'Loading file: '.$file.PHP_EOL;
require_once $file;
});
我的文件夹结构:
BaseModel
class(不是完整文件):
<?php
/**
* Model Base CRUD Banco de Dados
*/
namespace Models;
class BaseModel {
protected $tableName = null;
public function find($value, $field = 'id', $fieldType = \PDO::PARAM_STR){
if(!isset($this->tableName) || empty($this->tableName)){
return null;
}
$DB = new \DB;
$sql = sprintf("SELECT * FROM %s WHERE %s = :value", $this->tableName, $field);
$stmt = $DB->prepare($sql);
$stmt->bindParam(':value', $value, $fieldType);
$stmt->execute();
不知何故 PHP 正在寻找 "Models/" 大写文件夹?
你们以前经历过吗?
您正在通过将反斜杠字符串替换为斜杠来从 class 名称生成文件名:
$className = str_replace('\', DIRECTORY_SEPARATOR, $className);
由于您尝试加载的 class 名称是 \Models\BaseModel
,生成的文件名是 .../Models/BaseModel.php
。但是,您的文件的实际名称是 .../models/BaseModel.php
,因此 require
失败,因为 unixy 操作系统具有区分大小写的文件名。如果您遵循 PSR-4(您应该这样做),那么您的命名空间应该与您的目录匹配,并且您的文件应该与您的 classes 匹配。因此,class \Models\BaseModel
应该在名为 .../Models/BaseModel.php
.
的文件中定义
我在使用 PHP 自动加载特定 class 时遇到问题,它一直说找不到它。
错误:
Warning: require_once(Models/BaseModel.php): failed to open stream: No such file or directory in /var/www/html/icompare/init.php on line 29
Fatal error: require_once(): Failed opening required 'Models/BaseModel.php' (include_path='.:/usr/share/php:/var/www/html/icompare/lib') in /var/www/html/icompare/init.php on line 29
我的自动加载是如何在 init.php
中启动的:
set_include_path(get_include_path().PATH_SEPARATOR.APP_ROOT_PATH.DIRECTORY_SEPARATOR.'lib');
spl_autoload_extensions(".php");
spl_autoload_register(function($className){
$className = str_replace('\', DIRECTORY_SEPARATOR, $className);
$file = $className.".php";
// echo 'Loading file: '.$file.PHP_EOL;
require_once $file;
});
我的文件夹结构:
BaseModel
class(不是完整文件):
<?php
/**
* Model Base CRUD Banco de Dados
*/
namespace Models;
class BaseModel {
protected $tableName = null;
public function find($value, $field = 'id', $fieldType = \PDO::PARAM_STR){
if(!isset($this->tableName) || empty($this->tableName)){
return null;
}
$DB = new \DB;
$sql = sprintf("SELECT * FROM %s WHERE %s = :value", $this->tableName, $field);
$stmt = $DB->prepare($sql);
$stmt->bindParam(':value', $value, $fieldType);
$stmt->execute();
不知何故 PHP 正在寻找 "Models/" 大写文件夹? 你们以前经历过吗?
您正在通过将反斜杠字符串替换为斜杠来从 class 名称生成文件名:
$className = str_replace('\', DIRECTORY_SEPARATOR, $className);
由于您尝试加载的 class 名称是 \Models\BaseModel
,生成的文件名是 .../Models/BaseModel.php
。但是,您的文件的实际名称是 .../models/BaseModel.php
,因此 require
失败,因为 unixy 操作系统具有区分大小写的文件名。如果您遵循 PSR-4(您应该这样做),那么您的命名空间应该与您的目录匹配,并且您的文件应该与您的 classes 匹配。因此,class \Models\BaseModel
应该在名为 .../Models/BaseModel.php
.