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

Статус
В этой теме нельзя размещать новые ответы.

pav

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

ScDewt

Новичок
как вы реализуете автозагрузку классов?
Полтора года назад была такая необходимость (частично) - переписывался движок магазина и надо было юзать старые/новые классы, потому сделал так:
1. написал скрипт - парсер классов. В конфиге у него лежат пути директорий в которых могут быть классы. Скрипт запускался вручную и сканировал директории с классами, составляя карту классов.
2. spl_autoload_register подхватывал эту карту и автоматом по ней грузил нужный класс при необходимости. Потому в коде не надо было ни use прописывать, ни вручную инклудить - вообще не париться о местоположении класса.

p.s. после переписки движка классы все таки приобрели единое месторасположение, но систему карты классов оставили потому что все изначально делалось для DI - этакий аналог phemto заточенный под нужды магазина
 

skwee

Новичок
Namespaces которые отображают файловую систему (тоесть Foo/Bar/Class будет сидеть в /var/www/Foo/Bar/Class.php) + SplClassLoader
 
  • Like
Реакции: AmdY

zerkms

TDD infected
Команда форума
Не обязательно писать в неймспейсе полный путь к файлу в fs. Можно разделить классы на типы и использовать конструкции вида
PHP:
namespace Core;
final class Auth { ..........
или
PHP:
namespace Controller\Blog;
class Comments{ ..........
Сами скрипты при этом могут храниться где угодно. Такой синтаксис короче и читабельнее инглудов.
О каких инклудах вы вообще говорите? Если работает автозагрузка, то ни в случае с длинными именами классов, ни в случае с неймспейсами никаких инклудов нигде не будет.
 

pav

Новичок
О каких инклудах вы вообще говорите? Если работает автозагрузка, то ни в случае с длинными именами классов, ни в случае с неймспейсами никаких инклудов нигде не будет.
Я говорил, что неймспейсы удобнее и читабельнее инглудов, т.к. записать их можно короче. А вообще, это совершенно разные конструкции, не надо теплое сравнивать с мягким.
 

zerkms

TDD infected
Команда форума
pav
Вот именно, что это конструкции, которые выполняют совершенно разную работу, а вы в своём комменте говорите
Такой синтаксис короче и читабельнее инглудов.
Как неймспейсы могут быть короче и читабельнее, если инклуды всё равно кому-то придётся делать (автоматически или вручную).
 

pav

Новичок
pav
Вот именно, что это конструкции, которые выполняют совершенно разную работу, а вы в своём комменте говорите

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

zerkms

TDD infected
Команда форума
pav
Первая запись не исключает вторую. Перед использованием библиотеки её всё равно придётся загрузить тем же самым инклюдом.

Так что не, не ок
 

pav

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

zerkms

TDD infected
Команда форума
pav
Вы, вероятно, издеваетесь, потому что в случае, если за нас всю работу делает автолоадер, то ручного инклюда (о котором вы сетуете в последнем предложении) вообще не будет.

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

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

pav

Новичок
zerkms, вы либо не понимаете принципа работы автолоадера, либо одно из двух. Как автолоадер запретит мне сделать инглуд?

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

zerkms

TDD infected
Команда форума
zerkms, вы либо не понимаете принципа работы автолоадера, либо одно из двух. Как автолоадер запретит мне сделать инглуд?

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

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

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

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

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

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

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

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

pav

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

zerkms

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

С тем что вы говорите сейчас я согласен.
 

pav

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

zerkms

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

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

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

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

AmdY

Пью пиво
Команда форума
zerkms
может сам прикроешь тему в связи полной неадекватностью автора? А то у него "Смешались в кучу кони, люди, И залпы тысячи орудий"

http://phpclub.ru/talk/threads/как-вы-реализуете-автозагрузку-классов.71300/page-2#post-636585 здесь ссылка на автолодер, который спокойно резолвит как неймспейсы, так и пиар стайл. Из-за неё не перенёс тему в мусор.
 

dimitrius

Новичок
zerkms
может сам прикроешь тему в связи полной неадекватностью автора?
И почему?, дискуссия вышла оживленной, значит вопрос многовекторный.
Почему неадекватный? Мне просто нужно было определится с способом. Варианты были известны, но было интересно, может, у кого то есть фитча, которую я не знал
 

AmdY

Пью пиво
Команда форума
dimitrius
ой, извиняюсь, попутал топикстартера с вами, это у вас проблемы с определениями, вы в мануале найдёте больше фич, чем здесь.
закрываю.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху