Класс автозагрузки PHP не найден - PullRequest
1 голос
/ 06 ноября 2019

У меня проблема с автозагрузкой 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 Ответ

2 голосов
/ 06 ноября 2019

Вы генерируете имя файла из имени класса, выполняя замену обратной косой черты на косую черту:

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

Поскольку имя класса, который вы пытаетесь загрузить, равно \Models\BaseModel, генерируемое имя файлаэто .../Models/BaseModel.php. Однако фактическое имя вашего файла .../models/BaseModel.php, поэтому require завершается ошибкой, потому что в Unixy операционных системах имена файлов чувствительны к регистру. Если вы следуете PSR-4 (что вам следует), тогда ваши пространства имен должны соответствовать вашим каталогам, а ваши файлы должны соответствовать вашим классам. Таким образом, класс \Models\BaseModel должен быть определен в файле с именем .../Models/BaseModel.php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...