找不到PHP自动加载类

时间:2019-11-06 16:50:30

标签: php spl spl-autoload-register

我在使用特定类的PHP自动加载时遇到问题,在该类中一直说找不到。

错误:

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;
});

我的文件夹结构:

enter image description here

BaseModel类(不是完整文件):

<?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 /”大写文件夹? 你们以前有没有经历过?

1 个答案:

答案 0 :(得分:2)

您是通过将反斜杠替换为斜杠来从类名生成文件名的:

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

由于您要加载的类名是\Models\BaseModel,因此生成的文件名是.../Models/BaseModel.php。但是,文件的实际名称为.../models/BaseModel.php,因此require失败,因为unixy操作系统具有区分大小写的文件名。如果遵循PSR-4(应该这样做),则名称空间应与目录匹配,文件应与类匹配。因此,应该在名为\Models\BaseModel的文件中定义类.../Models/BaseModel.php