Не получается подключить автозагрузку. Как правильно писать код для автозагрузки? Класс
<?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';
});
Виртуальный выделенный сервер (VDS) становится отличным выбором
Всем привет, пишу скрипт грамматически правильного деления слова на слогиСтолкнулся с проблемой, подскажите пожалуйста, как переписать...