Спецификация 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 обеспечивает более лаконичную файловую структуру.
Ошибка Сегмента Записи