PHP PSR-4

生活百科 2023-01-25 18:02生活百科www.aizhengw.cn

PHP PSR-4

PSR

是制定的PHP规范,简称PSR,是PHP开发的事实标準。

PSR-4使代码更加规范,能够满足面向package的自动载入,它规范了如何从档案路逕自动载入类,规范了自动载入档案的位置。

基本介绍

  • 中文名PSR-4
  • 外文名PSR-4

PSR介绍

PSR原本有四个规范,分别是
  • PSR-0 自动载入
  • PSR-1 基本代码规范
  • PSR-2 代码样式
  • PSR-3 日誌接口
2013年底,新出了第5个规范——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最大的区别是对下划线(underscore)的定义不同。PSR-4中,在类名中使用下划线没有任何特殊含义。而PSR-0则规定类名中的下划线_会被转化成目录分隔设定。

代码样例

以下代码展示了遵循PSR-4的类定义,这个类处理多个命名空间
<?phpnamespace Example;/  An example of a general-purpose implementation that includes the optional  functionality of allowing multiple base directories for a single namespace  prefix.    Given a foo-bar package of classes in the file system at the following  paths ...        /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    ... add the path to the class files for the \Foo\Bar\ namespace prefix  as follows:         <?php       // instantiate the loader       $loader = new \Example\Psr4AutoloaderClass;              // register the autoloader       $loader->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');    The following line would cause the autoloader to attempt to load the  \Foo\Bar\Qux\Quux class from /path/to/packages/foo-bar/src/Qux/Quux.php:         <?php       new \Foo\Bar\Qux\Quux;    The following line would cause the autoloader to attempt to load the   \Foo\Bar\Qux\QuuxTest class from /path/to/packages/foo-bar/tests/Qux/QuuxTest.php:         <?php       new \Foo\Bar\Qux\QuuxTest; /class Psr4AutoloaderClass{    /      An associative array where the key is a namespace prefix and the value      is an array of base directories for classes in that namespace.           @var array     /    protected $prefixes = array();    /      Register loader with SPL autoloader stack.            @return void     /    public function register()    {        spl_autoload_register(array($this, 'loadClass'));    }    /      Adds a base directory for a namespace prefix.           @param string $prefix The namespace prefix.      @param string $base_dir A base directory for class files in the      namespace.      @param bool $prepend If true, prepend the base directory to the stack      instead of appending it; this causes it to be searched first rather      than last.      @return void     /    public function addNamespace($prefix, $base_dir, $prepend = false)    {        // normalize namespace prefix        $prefix = trim($prefix, '\\') . '\\';        // normalize the base directory with a trailing separator        $base_dir = rtrim($base_dir, '/') . DIRECTORY_SEPARATOR;        $base_dir = rtrim($base_dir, DIRECTORY_SEPARATOR) . '/';        // initialize the namespace prefix array        if (isset($this->prefixes[$prefix]) === false) {            $this->prefixes[$prefix] = array();        }        // retain the base directory for the namespace prefix        if ($prepend) {            array_unshift($this->prefixes[$prefix], $base_dir);        } else {            array_push($this->prefixes[$prefix], $base_dir);        }    }    /      Loads the class file for a given class name.           @param string $class The fully-qualified class name.      @return mixed The mapped file name on success, or boolean false on      failure.     /    public function loadClass($class)    {        // the current namespace prefix        $prefix = $class;        // work backwards through the namespace names of the fully-qualified        // class name to find a mapped file name        while (false !== $pos = strrpos($prefix, '\\')) {            // retain the trailing namespace separator in the prefix            $prefix = substr($class, 0, $pos + 1);            // the rest is the relative class name            $relative_class = substr($class, $pos + 1);            // try to load a mapped file for the prefix and relative class            $mapped_file = $this->loadMappedFile($prefix, $relative_class);            if ($mapped_file) {                return $mapped_file;            }            // remove the trailing namespace separator for the next iteration            // of strrpos()            $prefix = rtrim($prefix, '\\');           }        // never found a mapped file        return false;    }    /      Load the mapped file for a namespace prefix and relative class.            @param string $prefix The namespace prefix.      @param string $relative_class The relative class name.      @return mixed Boolean false if no mapped file can be loaded, or the      name of the mapped file that was loaded.     /    protected function loadMappedFile($prefix, $relative_class)    {        // are there any base directories for this namespace prefix?        if (isset($this->prefixes[$prefix]) === false) {            return false;        }        // look through base directories for this namespace prefix        foreach ($this->prefixes[$prefix] as $base_dir) {            // replace the namespace prefix with the base directory,            // replace namespace separators with directory separators            // in the relative class name, append with .php            $file = $base_dir                  . str_replace('\\', DIRECTORY_SEPARATOR, $relative_class)                  . '.php';            $file = $base_dir                  . str_replace('\\', '/', $relative_class)                  . '.php';            // if the mapped file exists, require it            if ($this->requireFile($file)) {                // yes, we're done                return $file;            }        }        // never found it        return false;    }    /      If a file exists, require it from the file system.            @param string $file The file to require.      @return bool True if the file exists, false if not.     /    protected function requireFile($file)    {        if (file_exists($file)) {            require $file;            return true;        }        return false;    }}

Copyright@2015-2025 www.aizhengw.cn 癌症网版板所有