Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761

Автозагрузка

17.10.2018, 09:17. Показов 1433. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Как-то стыдно даже, совсем мало знаю про автозагрузку, а полностью нужная мне инфа мною не гуглится.

До сих пор я редко использовал автозагрузку, полностью доверяя это дело фреймворкам, лишь для некоторых тестовых небольших проектов я удовлетворялся spl_autoload_register(). Но сейчас возникли сложности, и в связи с ними, вопросы.
1. Можно ли в проекте сделать неограниченное число автозагрузчиков? Например, я написал какой-то свой пакет, состоящий из множества файлов и папок, и хочу его использовать в проекте. Но автозагрузчиком проекта это все дело не загружается. Могу я добавить свой автозагрузчик в мой пакет, чтобы он не повлиял на автозагрузчик проекта? В моем случае я работал с фреймворком Symfony 1.4, но он не захотел искать классы в подпапках моего расширения. А когда я добавил свой spl_autoload_register, то перестали грузиться классы фреймворка... Что не так?
2. А что, если я хочу подключать не только классы, но и обычные php файлы с функциями? Считаю, что эти функции незачем помещать в отдельные классы, а достаточно выделить пространство имен.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.10.2018, 09:17
Ответы с готовыми решениями:

Автозагрузка и namespaces
У меня примерно такая структура файлов: app -controllers --MainController.php -core --Router.php --Controller.php -models ...

Автозагрузка класов
В коренной папке есть файлы index.php и несколько файлов(в каждом файле один класс (имя класса = имя файла)) Делаю autoload: ...

Правильная автозагрузка классов
Доброго времени суток, комрады. Пришлось познакомиться с автозагрузкой классов, удобная вещь, но только не до конца понимаю, как...

19
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
17.10.2018, 09:34
https://secure.php.net/manual/... toload.php
https://www.php-fig.org/psr/psr-4/
Смысла в своем автозагрузчике нет, нужно использовать composer, в продакшене обязательно использовать оптимизированный автозагрузчик

Цитата Сообщение от Зверушь Посмотреть сообщение
А что, если я хочу подключать не только классы, но и обычные php файлы с функциями?
Автозагрузка для функций не работает. Но в том же композере можно автоматически загрузить файл с функциями, правда он будет загружен всегда, или использовать статические методы вместо функций
1
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
17.10.2018, 11:40
Цитата Сообщение от Зверушь Посмотреть сообщение
Могу я добавить свой автозагрузчик в мой пакет, чтобы он не повлиял на автозагрузчик проекта?
Можно, но как сказали выше, лучше для этого использовать композер. Он умеет сам генерировать автозагрузчики. И базовый для проекта, и для каких-то локальных библиотек, и для общедоступных на github/packagist, и делается это очень просто через конфигурационный файлик.

Цитата Сообщение от Зверушь Посмотреть сообщение
когда я добавил свой spl_autoload_register, то перестали грузиться классы фреймворка
Сложно сказать, надо смотреть конкретный код.
1
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
17.10.2018, 14:58  [ТС]
Значит придется разбираться с композером...
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
17.10.2018, 16:02
Цитата Сообщение от Зверушь Посмотреть сообщение
Что не так?
вы не разобрались в архитектуре фреймворка.
лучше возьмите их автозагрузчик и допилите под себя (хотя это блажь в 99% случаев)

Цитата Сообщение от Зверушь Посмотреть сообщение
А что, если я хочу подключать не только классы, но и обычные php файлы с функциями?
грузите файл ДО загрузчика.
но вообще это дичь. Раскидайте свои ф-и по классам, а то потом рефакторить придётся.

spl_ -функции полностью решают все вопросы автозагрузки.
1
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
17.10.2018, 16:29  [ТС]
Цитата Сообщение от полудух Посмотреть сообщение
Раскидайте свои ф-и по классам, а то потом рефакторить придётся
Зачем мне создавать класс с несколькими статическими функциями и ненужностью создавать экземпляры класса?
Ну вот скажем, написал я несколько функций для работы с массивами (в дополнение к встроенным функциям). Зачем их помещать в отдельный класс? Я хочу вызывать их как функции. Естественно, что я поместил их в отдельный файл, и выделил им отдельный namespace. Разве это не логично?

Цитата Сообщение от полудух Посмотреть сообщение
лучше возьмите их автозагрузчик и допилите под себя (хотя это блажь в 99% случаев)
В код фреймворка лезть не хотелось бы. При обновлении фреймворка, например, мой код потрется.
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
17.10.2018, 16:31
Цитата Сообщение от Зверушь Посмотреть сообщение
Разве это не логично?
в простеньком парсере - пофиг
а в большом проекте с ООП - нет.

Цитата Сообщение от Зверушь Посмотреть сообщение
При обновлении фреймворка, например, мой код потрется.
а что вы ожидали, правя чужой фв?
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
17.10.2018, 16:33  [ТС]
Цитата Сообщение от полудух Посмотреть сообщение
Сообщение от Зверушь
Разве это не логично?
нет.
Почему? Почему логичен ваш вариант?

Цитата Сообщение от полудух Посмотреть сообщение
а что вы ожидали, правя чужой фв?
Я ожидал его не править.
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
17.10.2018, 16:36
Цитата Сообщение от Зверушь Посмотреть сообщение
Почему? Почему логичен ваш вариант?
потому что когда он разрастётся, сойдёте с ума

Цитата Сообщение от Зверушь Посмотреть сообщение
Я ожидал его не править.
как не править, если вы ему свой автозагрузчик втюхиваете?!
0
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
17.10.2018, 16:38
Цитата Сообщение от Зверушь Посмотреть сообщение
Значит придется разбираться с композером...
Автозагрузка классов с помощью Composer.
1
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
17.10.2018, 16:49  [ТС]
Цитата Сообщение от полудух Посмотреть сообщение
потому что когда он разрастётся, сойдёте с ума
Пока не убедительно Доказательства? Как набор функций для работы с массивами сведет меня с ума?

Цитата Сообщение от полудух Посмотреть сообщение
как не править, если вы ему свой автозагрузчик втюхиваете?!
Если бы я разобрался, то не задавал бы вопросов. Регистрируя spl_autoload_register в одном из файлов своего пакета, я надеялся, что он будет отрабатывать отдельно от автозагрузчика фреймворка. А он его перекрывает... Вот и задал вопрос что не так, и можно ли и как в каждом из своих пакетов писать автозагрузчик для каждого пакета. Но видимо придется использовать композер, хотя изначально хотел все решить средствами самого php.
0
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,230
17.10.2018, 16:57
Цитата Сообщение от Зверушь Посмотреть сообщение
Пока не убедительно Доказательства? Как набор функций для работы с массивами сведет меня с ума?
поймёте лет через 5-10. книжки читайте.

Цитата Сообщение от Зверушь Посмотреть сообщение
Регистрируя spl_autoload_register в одном из файлов своего пакета, я надеялся, что он будет отрабатывать отдельно от автозагрузчика фреймворка. А он его перекрывает...
так используйте их автозагрузчик
в противном случае, скорее всего, вы пишите какую-то дичь.
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
17.10.2018, 17:09
Цитата Сообщение от Зверушь Посмотреть сообщение
Как набор функций для работы с массивами сведет меня с ума?
Имхо если это дело держать под контролем - не сведёт, у того же Laravel есть куча вспомогательных функций.

Цитата Сообщение от Зверушь Посмотреть сообщение
Регистрируя spl_autoload_register в одном из файлов своего пакета, я надеялся, что он будет отрабатывать отдельно от автозагрузчика фреймворка. А он его перекрывает...
Скорее всего какой-нибудь неочевидный косяк в коде.
0
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
17.10.2018, 23:42
Зверушь, почитал я материал по ссылке, которую я опубликовал в прошлом посту, и понял, что разобраться по нему будет трудновато, поэтому решил объяснить сам. Предположим, в корневом каталоге вашего сайта создана директория app, в которой будут находиться все ваши классы - тогда последовательность ваших действий будет такова:
  • В корне сайта создаёте файл composer.json, и записываете в него следующий код:
Кликните здесь для просмотра всего текста
JSON
1
2
3
4
5
6
7
{
  "autoload" : {
    "classmap" : [
      "App"
    ]
  }
}
  • Здесь же (в корне сайта) создаёте файл index.php, и прописываете в нём пространство имён namespace App;
    Помимо этого в файле index.php вы должны прописать подключение файла autoload.php, который будет позже сгенерирован композером в папке /vendor:
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
<?php
 
namespace App;
 
require __DIR__ . '/vendor/autoload.php';
 
new MyClass(); // Создать экземпляр класса
  • В папке app создаёте файл с классом (например MyClass), и тоже прописываете в нём пространство имён namespace App;
    Обратите внимание: пространство имён должно соответствовать реальной директории в файловой системе вашего сервера!
Кликните здесь для просмотра всего текста
PHP
1
2
3
4
5
6
7
8
9
10
11
<?php
 
namespace App;
 
class MyClass
{
    public function __construct()
    {
        echo __CLASS__;
    }
}
  • Далее открываете консоль (описываю на примере консоли OpenServer), и переходите в корневую папку вашего проекта.
    Например ваш сайт oop.ru - тогда в консоли вводите команду cd domains\oop.ru и нажимаете "Ввод".
    Вы увидите, что в результате выполнения этой команды директория сменилась на d:\OSPanel\domains\oop.ru*1
  • И последний шаг - генерация файла autoload.php. В консоли вводите команду composer update, и на этом настройка автозагрузки завершена - можно обновить index.php и увидеть название класса и пространства имён App\MyClass.

Ещё сто́ит отметить, что можно создать папку (например temp) в каталоге app, и в ней создавать классы. Но для того, что бы композер мог подгружать эти классы, надо прописать в них пространство имён namespace App\Temp; и импортировать его в файл index.php с помощью оператора use: use App\Temp\NewClass;*2 И не забывать после добавления нэймспесов обновлять автолоадер командой composer update.

___________
Примечания:
1. Буква диска (d, c, и т.п.) будет зависеть от директории, в которой установлен OpenServer.
2. Подразумевается, что в директории App\Temp должен быть создан файл с классом NewClass.
1
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
17.10.2018, 23:58
VNIIAEN, а зачем classmap? Мне кажется, с директивой autoload гораздо проще.
Code
1
2
3
4
5
6
7
8
{
    "autoload": {
        "psr-4": {
            "App\\": "app"
        }
    }
 
}
И всё. Создали файл app/Controller/Test.php, дали ему неймспейс App\Controller\Test и всё работает без апдейтов.
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.10.2018, 00:02
Цитата Сообщение от VNIIAEN Посмотреть сообщение
И не забывать после добавления нэймспесов обновлять автолоадер командой composer update.
composer dump, но никак не update. И выполнять эту команду не обязательно, если автозагрузчик не оптимизированный.
1
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
18.10.2018, 00:11
Цитата Сообщение от Jodah Посмотреть сообщение
а зачем classmap? Мне кажется, с директивой autoload гораздо проще.
Я как раз хотел дописать и про "autoload": {}, но вы меня опередили.

Добавлено через 1 минуту
Цитата Сообщение от Jewbacabra Посмотреть сообщение
composer dump, но никак не update. И выполнять эту команду не обязательно, если автозагрузчик не оптимизированный.
Не спорю )
0
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
18.10.2018, 08:10  [ТС]
Отлично! Все подробно описано, спасибо!

И вернемся еще раз к функциям вне класса... почему их стоит перенести в отдельный класс? Только для возможности загрузки автозагрузчиком?
0
 Аватар для Строитель
1084 / 746 / 364
Регистрация: 09.07.2018
Сообщений: 1,760
18.10.2018, 08:17
Цитата Сообщение от Зверушь Посмотреть сообщение
И вернемся еще раз к функциям вне класса... почему их стоит перенести в отдельный класс? Только для возможности загрузки автозагрузчиком?
Наверное будет лучше использовать статические методы вместо функций. Это решит вопрос с автозагрузкой, и не придётся смешивать процедурное и ООП.
1
 Аватар для Зверушь
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
18.10.2018, 09:31  [ТС]
Наверное да, таки придется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.10.2018, 09:31
Помогаю со студенческими работами здесь

ООП автозагрузка, namespace, мультиязычность
Такая ситуация народ... Допустим есть модуль chat &lt;?php namespace modules\chat; use modules\notice\Notice; class...

Автозагрузка, пространство имен и вызов встроенных в php классов
Всем доброго времени суток. Есть следующий код для соединения с БД: namespace database; class DB { private static $instance =...

автозагрузка файла
можно ли в коде файла написать такой код чтобы этот файл сам начал закачаться из интернета?скажем когда человек зашел в какую то страницу?

Автозагрузка
Ситуация такая: При включении компьютера автоматически включается Internet Explorer. Как мне отключить эту автозагрузку ? (В меню пуск...

Как добавить файл в автозагрузку?
Как добавить файл в автозагрузку? Но не просто перетенуть файл, а сделать это кодом. С помощью меню.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru