Спецификация PHP, сформулированная FIG, сокращенно PSR, является фактическим стандартом разработки PHP.
PSR первоначально имел четыре спецификации, а именно:
- Автоматическая загрузка PSR-0
- Спецификация базового кода PSR-1
- Стиль кода PSR-2
- Интерфейс журнала PSR-3
В конце 2013 года была представлена пятая новая спецификация PSR-4.
PSR-4 указывает, как указать пути к файлам для автоматической загрузки определений классов, а также указывает расположение автоматически загружаемых файлов. На первый взгляд, это повторяется с PSR-0. На самом деле, у него действительно есть некоторое функциональное дублирование. Разница в том, что спецификация PSR-4 более чистая, удаляет контент, совместимый с предыдущими версиями PHP 5.3, и имеет небольшое представление об обновлении PSR-0. Конечно, PSR-4 не предназначен для полной замены PSR-0, но для дополнения PSR-0 при необходимости – конечно, PSR-4 также может заменить PSR-0, если хотите. PSR-4 может использоваться в сочетании с другими автоматическими механизмами загрузки, включая PSR-0.
Самая большая разница между PSR-4 и PSR-0 заключается в определении подчеркивания. В PSR-4 использование знаков подчеркивания в именах классов не имеет особого значения. PSR-0 указывает символы подчеркивания в именах классов _
Он преобразуется в разделитель каталогов.
Пример кода
В следующем коде показано определение класса, следующее за PSR-4, которое обрабатывает несколько пространств имен:
Соответствующий код модульного теста
files = $files; } protected function requireFile($file) { return in_array($file, $this->files); } } class Psr4AutoloaderClassTest extends \PHPUnit_Framework_TestCase { protected $loader; protected function setUp() { $this->loader = new MockPsr4AutoloaderClass; $this->loader->setFiles(array( '/vendor/foo.bar/src/ClassName.php', '/vendor/foo.bar/src/DoomClassName.php', '/vendor/foo.bar/tests/ClassNameTest.php', '/vendor/foo.bardoom/src/ClassName.php', '/vendor/foo.bar.baz.dib/src/ClassName.php', '/vendor/foo.bar.baz.dib.zim.gir/src/ClassName.php', )); $this->loader->addNamespace( 'Foo\Bar', '/vendor/foo.bar/src' ); $this->loader->addNamespace( 'Foo\Bar', '/vendor/foo.bar/tests' ); $this->loader->addNamespace( 'Foo\BarDoom', '/vendor/foo.bardoom/src' ); $this->loader->addNamespace( 'Foo\Bar\Baz\Dib', '/vendor/foo.bar.baz.dib/src' ); $this->loader->addNamespace( 'Foo\Bar\Baz\Dib\Zim\Gir', '/vendor/foo.bar.baz.dib.zim.gir/src' ); } public function testExistingFile() { $actual = $this->loader->loadClass('Foo\Bar\ClassName'); $expect = '/vendor/foo.bar/src/ClassName.php'; $this->assertSame($expect, $actual); $actual = $this->loader->loadClass('Foo\Bar\ClassNameTest'); $expect = '/vendor/foo.bar/tests/ClassNameTest.php'; $this->assertSame($expect, $actual); } public function testMissingFile() { $actual = $this->loader->loadClass('No_Vendor\No_Package\NoClass'); $this->assertFalse($actual); } public function testDeepFile() { $actual = $this->loader->loadClass('Foo\Bar\Baz\Dib\Zim\Gir\ClassName'); $expect = '/vendor/foo.bar.baz.dib.zim.gir/src/ClassName.php'; $this->assertSame($expect, $actual); } public function testConfusion() { $actual = $this->loader->loadClass('Foo\Bar\DoomClassName'); $expect = '/vendor/foo.bar/src/DoomClassName.php'; $this->assertSame($expect, $actual); $actual = $this->loader->loadClass('Foo\BarDoom\ClassName'); $expect = '/vendor/foo.bardoom/src/ClassName.php'; $this->assertSame($expect, $actual); } }
Композитор
Система управления пакетами PHP Composer уже поддерживает PSR-4, но также позволяет в composer
.json
Определять разные префиксы, используя различные механизмы автоматической загрузки.
Композитор использует стиль 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\ClassName
Композитор использует стиль PSR-4
vendor/ vendor_name/ package_name/ src/ ClassName.php # Vendor_Name\Package_Name\ClassName tests/ ClassNameTest.php # Vendor_Name\Package_Name\ClassNameTest
Сравнивая две вышеперечисленные структуры, мы можем ясно видеть, что PSR-4 обеспечивает более лаконичную файловую структуру.
Ошибка Сегмента Записи