Проблема автозагрузка PHP

167
26 октября 2018, 14:40

Не получается подключить автозагрузку. Как правильно писать код для автозагрузки? Класс

<?php
namespace App\Models;
class Article extends Model {
    public $title;
    public $content;
    public $author;
    public static function findLatestNews()
    {
        $db = new Db;
        $sql = 'SELECT * FROM  news ORDER BY id DESC LIMIT 3';
        return $db->query($sql,[], static::class);
    }
};

Файл с автозагрузкой

<?php
spl_autoload_register(function ($class_name) {
    include $class_name . '.php';
});

Подключение

<?php
require __DIR__.'/autoload.php';
$article= new App\Models\Article();
$article->title = 'Мишки любят конфеты с коньяком';
?>

Структура файлов

И получаю ошибки

Warning: include(App\Models\Article.php): failed to open stream: No such file or directory in C:\OSPanel\domains\2-php-7-2\App\autoload.php on line 3

Warning: include(): Failed opening 'App\Models\Article.php' for inclusion (include_path='.;c:/ospanel/modules/php/PHP-7.2-x64;c:/ospanel/modules/php/PHP-7.2-x64/PEAR/pear') in C:\OSPanel\domains\2-php-7-2\App\autoload.php on line 3

Fatal error: Uncaught Error: Class 'App\Models\Article' not found in C:\OSPanel\domains\2-php-7-2\App\index.php:3 Stack trace: #0 {main} thrown in C:\OSPanel\domains\2-php-7-2\App\index.php on line 3

Если файлы лежат в одной директории и в начале классов не прописывать namespace то автозагрузка работает корректно

Answer 1

Не претендую на истину, однако осмелюсь написать...

Если вы посмотрите на современные библиотеки да и вообще на проекты, то увидите что сейчас везде и повсеместно используется composer . По сути composer представляет из себя то что называют "менеджер зависимостей". В javascript это например npm или yarn . В Python это pip. В PHP это composer. Поверьте, если вы не собираетесь всю жизнь ковырять говносайты построенные на joomla или (о боги!) 1сBitrix, то самое время не пытаться городить автозагрузчики (при этом не очень разбираясь, как я понимаю, в PSR0, PSR4), а использовать то, что используют в общем то те ребята, которые задают нынче моду в PHP (тут я и про Symfony и про Laravel и про Yii в конце концов, хотя последнее в руках не держал).

Я говорю о стандартах, которые в российском сегменте интернета почему то пытаются игнорировать, тем самым генерируя огроменное количество говна, которое как раз и выливается в виде Битрикса.

Не буду описывать "пошагово", наверняка вы разберетесь если захотите. Тем не менее смею заверить что с помощью данного инструмента вы сможете очень быстро и прозрачно импортировать себе в проект нужные вам библиотеки и сосредоточитесь на разработке, а не на том что вам придется думать как сделать автозагрузку своего проекта. С уважением! :)

Answer 2

Сперва в файле index.php создать константу которая будет хранить путь к корню проекта:

define('ROOT_PATH', __DIR__ . DIRECTORY_SEPARATOR);

И вот вам пример который позволит понять как это реализовать:

function autoloader($className)
{
    try {
        $path = str_replace('\\', DIRECTORY_SEPARATOR, $className);
        $file = ROOT_PATH . $path . '.php';
        if (!is_file($file))
            throw new \Exception ($file.' file not found');
        include ($file);
    } catch (\Exception $ex) {
        echo $ex->getMessage();
        exit;
    }
}
spl_autoload_register('autoloader');
Answer 3

Конкретно для вашего примера, нужно просто указать \

<?php
spl_autoload_register(function ($class_name) {
    include '\\' . $class_name . '.php';
});
READ ALSO
Как начать массив с единицы - PHP

Как начать массив с единицы - PHP

Есть вот такой массив:

210
Переписать с JS на PHP

Переписать с JS на PHP

Всем привет, пишу скрипт грамматически правильного деления слова на слогиСтолкнулся с проблемой, подскажите пожалуйста, как переписать...

159