Автозагрузка Composer PSR-4 "класс не найден" отладка - PullRequest
0 голосов
/ 18 ноября 2018

Да, еще один вопрос об ошибке «класс не найден». Либо я что-то упустил, либо я неправильно понял логику PSR-4.

Структура директории библиотеки моего композитора:

"Scanner" => "src" => "Test.php"

test.php

namespace MyNS;

class Test
{
}

composer.json

"autoload": {
        "psr-4": {
            "MyNS\\": "src/"
        },
}

Итак, теперь я загружаю библиотеку в своем проекте с помощью composer и пытаюсь использовать ее.

require_once("../vendor/autoload.php");

$test = new MyNS\Test();

Что всегда приводит к

«Неустранимая ошибка: необученная ошибка: класс« MyNS \ Test »не найден».

. Чего мне не хватает? Я смотрю на это уже несколько дней. Я изменил папки, я изменил имена папок, я изменил uppper на более низкий и наоборот. Кажется, ничего не работает.

Я использую PHP 7.2.2 и Composer версии 1.2.2

Даже пробовал это:

require_once("../vendor/autoload.php");

use MyNS\Test;

$scanner = new Test();

Обновление

Я отлаживаю метод файла Composer ClassLoader.php (findFileWithExtension ($ class, $ ext))), и, очевидно, мои файлы никогда не загружаются, потому что мне выдают echo "Done" и die (); в конце этого метода, что означает, что файл не найден и, следовательно, не загружен. Что не так с моим composer.json?

{
    "name": "test/test",
    "type": "library",
    "description": "",
    "keywords": ["php"],
    "homepage": "",
    "license": "MIT",
    "authors": [
        {
            "name": "",
            "email": "",
            "homepage": "",
            "role": ""
        }
    ],
    "require": {
        "php": ">=7.2.2"
    },
    "autoload": {
        "psr-4": {
            "MyNS\\": "src/"
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Чтобы отладить происходящее, откройте ClassLoader.php файл и перейдите туда, где определен метод findFileWithExtension() для добавления оператора echo:

# vendor/composer/ClassLoader.php:386

foreach ($this->prefixDirsPsr4[$search] as $dir) {
    if (file_exists($file = $dir . $pathEnd)) {
        return $file;
    }
    // Add this line
    echo $file, PHP_EOL;
}

Не делать composer dumpautoload после того, как вы вручную изменили вышеуказанный файл, пока мы не закончим.

Теперь, выполнив свой PHP-файл, вы увидите нечто похожее на это в самом начале вывода:

path/to/project/vendor/composer/../../src/Test.php

Что такое:

path/to/project/src/Test.php

Итак, это файл, который ищет композитор, и он должен содержать что-то вроде этого:

namespace MyNS;

class Test { }

Если есть проблема с включением файла, это означает, что вам нужно заботиться о трех вещах:

  1. Путь и имя файла
  2. Пространство имен, используемое в файле
  3. Имя класса, используемое в файле (имя класса должно совпадать с именем файла)
0 голосов
/ 18 ноября 2018

Я думаю, что проблема в вашей декларации пространства имен

вы вызываете класс из MyNS, но пространство имен класса namespace MyNS\PSR4;

require_once("../vendor/autoload.php");

$test = new MyNS\Test();

// it should be new MyNS\PSR4\Test();

и убедитесь, что ваш файл класса находится в том же каталоге, который вы упомянули в composer autoload file

также необходимо выполнить команду dump-autoload для любого изменения имен классов

вы можете посетить эту функцию автозагрузки функцию

...