PHP: автозагрузка классов. Объясните на пальцах на простом примере?

Добрый день! В ООП не силен, но хочу исправить это.
Вот во всяких фрэймворках с MVC я вижу подключение классов не как require "class.php", а что-то типа такого:

namespace something\base;
use something\models\Login;


Полез как положено в ман php, но как-то сложно воспринимается. Поэтому решил здесь спросить. Могли бы Вы на примере двух-трех файлов показать как ПРАВИЛЬНО использовать namespace и use? К примеру есть пару классов и файл в котором это все вызывается используя вышеупомянутые фичи. Фрэймворки все большие и черт ногу сломит там разобрать как они это реализуют. Мне бы просто хороший и небольшой пример, а дальше я сам разберусь. Заранее спасибо!
  • Вопрос задан
  • 18674 просмотра
Решения вопроса 2
delphinpro
@delphinpro
frontend developer
Все свои классы располагаете в папке app/ (к примеру)
Всем классам задаете namespace Fogersp\SuperProject
В composer.json пишете в секции autoload

...
"autoload": {
  "psr4": {
    "Fogersp\\SuperProject\\": "app"
  }
},
...


Это значит, что классы с нэймспейсом Fogersp\SuperProject автозагрузчик будет искать в папке app/
Например, класс Fogersp\SuperProject\DB\Entry должен располагаться в файле app/DB/Entry.php

Далее в корне проекта выполняете команду
composer dumpautoload
и композер создаст вам автозагрузчик.

Теперь в точке входа подключаете этот загрузчик и не паритесь о подключении файлов
include '../vendor/autoload.php';

Вот и всё =)
Ответ написан
DevMan
@DevMan Куратор тега PHP
Да прост открываете psr и читаете, там и примеры есть.
Кстати, автозагрузка классов не имеет никакого отношения к ооп.

в принципе, все основы описаны тут php.net/manual/ru/language.oop5.autoload.php

Вы б лучше описали что конкретно непонятно, тогда можно было б отвечать более предметно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
gobananas
@gobananas
finishhim.ru
Оба автозагрузчика грузят только те классы, которые присутствуют (объявлены new) в этом php-файле:

// Определяем место где лежат файлы классов, которые будем загружать
define('DIR',  __DIR__);
define('APP',  DIR.'/app');

// Устаревший вариант
function __autoload($class) {
    include APP. '/'. $class . '.php';
}
 
// Актуальный вариант с безымянной функцией
spl_autoload_register(function ($class) {
    include APP. '/' . $class . '.php';
});
 
$obj1  = new MyClass1();
$obj1->displayVar();


В вашем примере
namespace something\base;
use something\models\Login;
вы определяете пространство имён и говорите его использовать словом use
Ответ написан
@oxidmod
нужно зарегать функу автолоадер, она будет при обращении к класу по неймспейсу грузить класс сама.
советую почитать про пср-0 и пср-4
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы