Не получается подключить автозагрузку. Как правильно писать код для автозагрузки? Класс
<?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 то автозагрузка работает корректно
Не претендую на истину, однако осмелюсь написать...
Если вы посмотрите на современные библиотеки да и вообще на проекты, то увидите что сейчас везде и повсеместно используется composer . По сути composer представляет из себя то что называют "менеджер зависимостей". В javascript это например npm или yarn . В Python это pip. В PHP это composer.
Поверьте, если вы не собираетесь всю жизнь ковырять говносайты построенные на joomla или (о боги!) 1сBitrix, то самое время не пытаться городить автозагрузчики (при этом не очень разбираясь, как я понимаю, в PSR0, PSR4), а использовать то, что используют в общем то те ребята, которые задают нынче моду в PHP (тут я и про Symfony и про Laravel и про Yii в конце концов, хотя последнее в руках не держал).
Я говорю о стандартах, которые в российском сегменте интернета почему то пытаются игнорировать, тем самым генерируя огроменное количество говна, которое как раз и выливается в виде Битрикса.
Не буду описывать "пошагово", наверняка вы разберетесь если захотите. Тем не менее смею заверить что с помощью данного инструмента вы сможете очень быстро и прозрачно импортировать себе в проект нужные вам библиотеки и сосредоточитесь на разработке, а не на том что вам придется думать как сделать автозагрузку своего проекта. С уважением! :)
Сперва в файле 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');
Конкретно для вашего примера, нужно просто указать \
<?php
spl_autoload_register(function ($class_name) {
include '\\' . $class_name . '.php';
});
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости