как вы реализуете автозагрузку классов?

Статус
В этой теме нельзя размещать новые ответы.
A1x
Вопрос был о способе адресации файла. Какая разница, загружает use что-то или нет - всё равно в имени нейсмпейса + класса придётся поддерживать структуру аналогичную фс, потому что именно это не очень нравится тредстартеру.

Не обязательно писать в неймспейсе полный путь к файлу в fs. Можно разделить классы на типы и использовать конструкции вида
PHP:
namespace Core;
final class Auth { ..........
или
PHP:
namespace Controller\Blog;
class Comments{ ..........
Сами скрипты при этом могут храниться где угодно. Такой синтаксис короче и читабельнее инглудов.
 
как вы реализуете автозагрузку классов?
Полтора года назад была такая необходимость (частично) - переписывался движок магазина и надо было юзать старые/новые классы, потому сделал так:
1. написал скрипт - парсер классов. В конфиге у него лежат пути директорий в которых могут быть классы. Скрипт запускался вручную и сканировал директории с классами, составляя карту классов.
2. spl_autoload_register подхватывал эту карту и автоматом по ней грузил нужный класс при необходимости. Потому в коде не надо было ни use прописывать, ни вручную инклудить - вообще не париться о местоположении класса.

p.s. после переписки движка классы все таки приобрели единое месторасположение, но систему карты классов оставили потому что все изначально делалось для DI - этакий аналог phemto заточенный под нужды магазина
 
Namespaces которые отображают файловую систему (тоесть Foo/Bar/Class будет сидеть в /var/www/Foo/Bar/Class.php) + SplClassLoader
 
  • Like
Реакции: AmdY
Не обязательно писать в неймспейсе полный путь к файлу в fs. Можно разделить классы на типы и использовать конструкции вида
PHP:
namespace Core;
final class Auth { ..........
или
PHP:
namespace Controller\Blog;
class Comments{ ..........
Сами скрипты при этом могут храниться где угодно. Такой синтаксис короче и читабельнее инглудов.
О каких инклудах вы вообще говорите? Если работает автозагрузка, то ни в случае с длинными именами классов, ни в случае с неймспейсами никаких инклудов нигде не будет.
 
О каких инклудах вы вообще говорите? Если работает автозагрузка, то ни в случае с длинными именами классов, ни в случае с неймспейсами никаких инклудов нигде не будет.
Я говорил, что неймспейсы удобнее и читабельнее инглудов, т.к. записать их можно короче. А вообще, это совершенно разные конструкции, не надо теплое сравнивать с мягким.
 
pav
Вот именно, что это конструкции, которые выполняют совершенно разную работу, а вы в своём комменте говорите
Такой синтаксис короче и читабельнее инглудов.
Как неймспейсы могут быть короче и читабельнее, если инклуды всё равно кому-то придётся делать (автоматически или вручную).
 
pav
Вот именно, что это конструкции, которые выполняют совершенно разную работу, а вы в своём комменте говорите

Как неймспейсы могут быть короче и читабельнее, если инклуды всё равно кому-то придётся делать (автоматически или вручную).

Запись
PHP:
use Libs\Qwerty;
короче и читабельнее, чем
PHP:
include_once(ROOT."/folder/subfolder/scripts/megaframework/applications/yoba/php/php6/libraries/Qwerty.php");
ок?
 
pav
Первая запись не исключает вторую. Перед использованием библиотеки её всё равно придётся загрузить тем же самым инклюдом.

Так что не, не ок
 
zerkms, все-таки ок, т.к. при использовании первой вторую запись нужно сделать всего один раз в автолоадере.
И да, на всякий случай: прямые инглуды в обход лоадера - очень плохой тон, во много раз усложняют отладку и понимание кода другими людьми.
 
pav
Вы, вероятно, издеваетесь, потому что в случае, если за нас всю работу делает автолоадер, то ручного инклюда (о котором вы сетуете в последнем предложении) вообще не будет.

Перечитайте, пожалуйста, все свои комментарии ещё раз: в свете того что у нас есть автолоадер - у нас нет инклюда вообще, стало быть ваше утверждение: "неймспейсы лучше инклюдов" становится некорректным, потому что инклюда в нашем коде в явном виде вообще нет.

Я даже процитирую, чтобы вам было проще:
Я говорил, что неймспейсы удобнее и читабельнее инглудов, т.к. записать их можно короче

И расшифрую вам ваши же слова: инклюдов у нас нет, их работу делает автолоадер. Я сомневаюсь, что вы сможете записать что-то короче чем 0 символов.
 
zerkms, вы либо не понимаете принципа работы автолоадера, либо одно из двух. Как автолоадер запретит мне сделать инглуд?

>Какая разница, загружает use что-то или нет - всё равно в имени нейсмпейса + класса придётся поддерживать структуру аналогичную фс
Я ответил, что разница есть, и эта разница огромна. И что структуру fs не придется поддерживать в полной мере, если принять некоторые соглашения об именах в своем проекте.
 
zerkms, вы либо не понимаете принципа работы автолоадера, либо одно из двух. Как автолоадер запретит мне сделать инглуд?

>Какая разница, загружает use что-то или нет - всё равно в имени нейсмпейса + класса придётся поддерживать структуру аналогичную фс
Я ответил, что разница есть, и эта разница огромна.
Уж поверьте мне, я отлично понимаю принцип работы автолоадера. Он не запретит его вам делать.

А вот с формальной логикой уже у вас проблемы.

Попробую разжевать вам в чём именно вы неправы (во второй раз, с картинками).

1. Вы утверждаете что
Такой синтаксис короче и читабельнее инглудов.

2. Вы утверждаете что
т.к. при использовании первой вторую запись нужно сделать всего один раз в автолоадере.

Теперь смотрите на руки:

в случае, если у нас есть работающий автолоадер, нам:
1. не нужно писать инклюды вручную
2. вариант с неймспейсами потребует как минимум 1 лишнюю строку `namespace ...` или `use ...`. Что в случае с длинными именами классов не требуется.

Вот именно в этом месте ваша логика и перестаёт работать, ибо не указывать ничего всегда проще чем указывать хоть что-либо.

И что структуру fs не придется поддерживать в полной мере, если принять некоторые соглашения об именах в своем проекте.
Абсолютно никакой разницы - используем мы неймспейсы или укладываем всё в имя класса - результат будет тот же. Или полная копия пути в имени, или соглашения. Разницы никакой.

PS: пожалуйста, перед своим следующим ответом убедитесь, что вы понимаете о чём я в принципе говорю. Повторять то же самое в третий раз мне будет лень.
 
Абсолютно никакой разницы - используем мы неймспейсы или укладываем всё в имя класса - результат будет тот же
Да неужели? Мне написать несколько примеров Длинные_Имена_Классов vs Использование\Неймспейсов или сами найдете?
И да, меня не покидает чувство, что мы спорим о какой-то хуйне.
 
Да неужели? Мне написать несколько примеров Длинные_Имена_Классов vs Использование\Неймспейсов или сами найдете?
Я вам дважды цитировал ваши слова, вы говорили не об использовании длинных имён классов, а об инклюдах. Я могу повторить ещё раз: вы сказали, что неймспейсы лучше инклюдов. Не находите, что вы сами сравнили яблоки с апельсинами?

С тем что вы говорите сейчас я согласен.
 
. Я могу повторить ещё раз: вы сказали, что неймспейсы лучше инклюдов.
Лучше/хуже - понятия субъективные, и таких оценок я не давал. Я написал, что неймспейсы удобнее и читабельнее инглудов, да и длинных имен тоже, кстати.
А вообще, я уже потерял нить дискуссии - с чего началось сравнение инглудов с неймспейсами?
 
Лучше/хуже - понятия субъективные, и таких оценок я не давал. Я написал, что неймспейсы удобнее и читабельнее инглудов, да и длинных имен тоже, кстати.
Как можно их вообще сравнивать?
Я повторяю в четвертый раз: как можно сравнивать читабельность неймспейсов с тем, чего у нас в коде нет в принципе??? (потому что инклуды у нас делает автолоадер)

С длинными именами повторно соглашаюсь.

А вообще, я уже потерял нить дискуссии - с чего началось сравнение инглудов с неймспейсами?
Началось с того, что вы запостили вот это вот: http://phpclub.ru/talk/threads/как-вы-реализуете-автозагрузку-классов.71300/page-2#post-636571

При этом непонятно зачем сделав акцент на:
Не обязательно писать в неймспейсе полный путь к файлу в fs.
Ибо и в имени класса нам тоже не обязательно писать полный путь (коль у нас есть соглашения).
 
zerkms
может сам прикроешь тему в связи полной неадекватностью автора? А то у него "Смешались в кучу кони, люди, И залпы тысячи орудий"

http://phpclub.ru/talk/threads/как-вы-реализуете-автозагрузку-классов.71300/page-2#post-636585 здесь ссылка на автолодер, который спокойно резолвит как неймспейсы, так и пиар стайл. Из-за неё не перенёс тему в мусор.
 
zerkms
может сам прикроешь тему в связи полной неадекватностью автора?
И почему?, дискуссия вышла оживленной, значит вопрос многовекторный.
Почему неадекватный? Мне просто нужно было определится с способом. Варианты были известны, но было интересно, может, у кого то есть фитча, которую я не знал
 
dimitrius
ой, извиняюсь, попутал топикстартера с вами, это у вас проблемы с определениями, вы в мануале найдёте больше фич, чем здесь.
закрываю.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху