«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Битва за автозагрузки: PSR-0 против PSR-4

Битва за автозагрузки: PSR-0 против PSR-4

Опубликовано в 2025-03-25
Просматривать:772

Битва за автозагрузки: PSR-0 против PSR-4

Key Takeaways

    ]
  • PSR-0 и PSR-4 являются стандартами автозагрузки в PHP, с PSR-0 определяющими пути, основанные на пространстве имен класса и позволяя недостаточным показателям в именах классов, в то время как PSR-4 стремится упростить структуру папок и удалить остатки PSR-0.
  • ]
  • PSR-4, называемый автозагрузкой, ориентированной на упаковку, позволяет реализовать более чистые пакеты, но более сложный для реализации. Это также гарантирует, что автозагрузчики никогда не должны бросать исключения и не собирать ошибки, поддерживая совместимость с несколькими автозагрузками.
  • ]
  • как PSR-0, так и PSR-4 имеют свои плюсы и минусы: PSR-4 допускает более простые структуры папок, но не показывает точный путь класса из его полностью квалифицированного имени, в то время как PSR-0 может быть хаотичным, но поддерживает разработчиков, используя более старые соглашения о именовании и помогают найти класс из его имени. &&]]
  • ]
Если вы прошли мимо начальной стадии в своем обучении PHP, вы слышали о PSR-0-стандарт автозагрузки, который определяет способы автоматического включения классов PHP в ваш код без необходимости использовать такие операторы, как требуется и включает.

]

psr-0

PSR-0 смотрит на пространство имен класса и различает его местоположение на жестком диске от этого кусочка информации. Например, класс \ zend \ mail \ message приведет к /пат/no/project/lib/vendor/zend/mail/message.php.try&&&]]

PSR-0 также поддерживает недостатки в именах классов в качестве альтернативы, чтобы облегчить переход с 5.2 и раньше. Zend_mail_message также приведет к /пат/to/project/lib/vendor/zend/mail/message.php.try&&&]]

Композитор

, когда Composer появился и взял мир управления пакетами PHP, все изменилось. Из-за некоторых его правил папки часто дублировались и становятся слишком глубокими, если смотреть на установки класса PSR-0 через композитор. Например, некоторые структуры папок оказались таковыми:

]

продавец/ vendor_name/ package_name/ SRC/ Vendor_name/ Package_name/ Classname.php # vendor_name \ package_name \ classname тесты/ Vendor_name/ Package_name/ Classnametest.php # vendor_name \ package_name \ classnametest

это в лучшем случае хаотично, потому что:
vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
]

каталоги «SRC» и «Тесты» должны включать имена каталогов поставщиков и пакетов. Это артефакт соответствия PSR-0.

]
]

поэтому некоторые высококвалифицированные разработчики PHP собрались и собрали предложение для нового стандарта: PSR-4.

]
PSR-4

PSR-4 стремится дополнить и работать вместе с PSR-0, где это необходимо, не полностью заменить его. Это может, но не должно. Основной целью PSR-4 является удаление остатков PSR-0 и полностью до 5,3 дней, а также обеспечить более краткую структуру папок. С PSR-4 приведенное выше дерево папок будет выглядеть следующим образом:

продавец/ vendor_name/ package_name/ SRC/ Classname.php # vendor_name \ package_name \ classname тесты/ Classnametest.php # vendor_name \ package_name \ classnametest

модернизация PSR-0 не была опцией
vendor/
    vendor_name/
        package_name/
            src/
                Vendor_Name/
                    Package_Name/
                        ClassName.php       # Vendor_Name\Package_Name\ClassName
            tests/
                Vendor_Name/
                    Package_Name/
                        ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest
]

, потому что PSR-0 не допускает ходатайства между любыми частями имени класса

]

это очень важно-это означает, что реализация PSR-4, одновременно обеспечивать гораздо более чистые пакеты, будет гораздо сложнее реализовать. Мы называем PSR-4, ориентированную на пакет, автозагрузку, потому что она способствует чистоте упаковки перед простотой.

]
выбранный подход

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

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

]

, кроме того, в проекте явно указывается, что автозазагрузка PSR-4 никогда не должен бросать исключения или устранять ошибки просто потому, что могут быть зарегистрированы несколько автозагрузчиков, и, если кто-то не загружает класс, другим следует предоставить возможность сделать это-бросить ошибку и остановить поток, разбивает эту совместимость. Если требуется дополнительная информация о сбое, следует использовать совместимый с PSR-3 регистратором или другие произвольные средства.

]

, как показано в файле примера, используя автолюзагруз PSR-4 для загрузки классов из следующей структуры:

]

/path/to/packages/foo-bar/ SRC/ Baz.php # foo \ bar \ baz Qux/ Quux.php # foo \ bar \ qux \ quux тесты/ Baztest.php # foo \ bar \ baztest Qux/ Quuxtest.php # foo \ bar \ qux \ quuxtest

]

будет выглядеть следующим образом:

]
      /path/to/packages/foo-bar/
          src/
              Baz.php             # Foo\Bar\Baz
              Qux/
                  Quux.php        # Foo\Bar\Qux\Quux
          tests/
              BazTest.php         # Foo\Bar\BazTest
              Qux/
                  QuuxTest.php    # Foo\Bar\Qux\QuuxTest

, где вызов New \ foo \ bar \ qux \ quux; попытался загрузить из первого зарегистрированного каталога, в то время как новый \ foo \ bar \ qux \ quuxtest; попытался загрузить со второго.

]
 register();

    // register the base directories for the namespace    prefix
    $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/src');
    $loader->addNamespace('Foo\Bar', '/path/to/packages/foo-bar/tests');
]

Заключение

нет серебряной пули в автозагрузке. Каждый подход приносит с собой некоторые плюсы и минусы-PSR-4 позволил бы проще структуры папок, но не позволил бы нам знать точный путь класса, просто посмотрев на полностью квалифицированное имя. PSR-0, с другой стороны, хаотичен на жестком диске, но поддерживает разработчиков, которые застряли в прошлом (пользователи подчеркивания в своем классе) и помогают нам различить местоположение класса, просто посмотрев на его имя.

]

как вы относитесь к PSR-4? Дайте нам знать в комментариях ниже или выразите свое мнение в одной из многих дебатов.

]

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

]

часто задаваемые вопросы о PSR-0 и PSR-4 AutoLoading

]

] каково основное различие между PSR-0 и PSR-4? PSR-0 требует прямой корреляции между пространствами имен и структурой каталогов, что означает, что каждый подчеркивается в пространстве имен соответствует сепаратору каталога. С другой стороны, PSR-4 допускает более гибкий подход, когда часть пространства имен может быть сопоставлена ​​с каким-либо каталогом, а остальная часть пространства имен может быть сопоставлена ​​с подкаканом. Строгая корреляция PSR-0 между пространствами имен и структурой каталогов привела к глубоко вложенным каталогам, что не всегда было практичным или эффективным. PSR-4 обеспечивает более гибкий подход, позволяющий разработчикам отображать пространства имен в любом каталоге, уменьшая необходимость в гнездование глубокого каталога.

Могу ли я использовать как PSR-0, так и PSR-4 в одном и том же проекте? Тем не менее, важно отметить, что они не должны использоваться для автозагрузки тех же классов. Использование обоих стандартов может быть полезным в крупных проектах, где какой-то устаревший код следует стандарту PSR-0, в то время как новый код следует стандарту PSR-4.

, как PSR-4 улучшается при PSR-0? Это позволяет разработчикам сопоставить часть пространства имен в любом каталоге, уменьшая необходимость в гнездование глубокого каталога. Это облегчает управление и навигацию по структуре каталога проекта.

PSR-0 устарел? Это означает, что, хотя он все еще функционален, он не рекомендуется для использования в новых проектах. PSR-4-это рекомендуемый стандарт для автозагрузки в PHP.

Как работает автозагрузка в PSR-4?

в PSR-4, автозагружая работает, отображая часть пространства имен с каким-либо каталогом. Остальная часть пространства имен затем отображается в подкаталярную структуру. Это допускает более гибкий и эффективный подход к автозагрузке.

Каковы преимущества использования PSR-4?

PSR-4 предлагают несколько преимуществ, включая более гибкий подход к автозагрузке, уменьшенную потребность в гнездование глубокого каталогов и повышенную эффективность. Это также рекомендуемый стандарт для автозагрузки в PHP, что делает его хорошим выбором для новых проектов.

] Как я могу перенести из PSR-0 в PSR-4? В PSR-4 часть пространства имен может быть сопоставлена ​​с любым каталогом, а остальная часть пространства имен может быть сопоставлена ​​с подканальной структурой. Это может потребовать реструктуризации структуры каталога вашего проекта.

Могу ли я использовать PSR-4 в более старых версиях PHP?

PSR-4 требует PHP 5,3 или более поздней. Если вы используете более старую версию PHP, вам нужно будет обновить, чтобы использовать PSR-4.

, какое будущее автозагрузки в PHP?

будущее автозагрузки в PHP, вероятно, будет продолжаться, с новыми стандартами и практиками, которые будут представлены в качестве языка и его экосистема. Тем не менее, в обозримом будущем PSR-4 является рекомендуемым стандартом для автозагрузки в PHP.

]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3