Psr

B15CAE74-5F60-4298-9115-774D5ABF6B3F

FIG组织制定了相关的PHP规范,简称Psr。主要制定了命名空间、类名、自动加载规范以及相关的编码规范。一个拥有规范命名的项目,将会使得通用的自动加载机制能够很容易的引入该项目,所以学习Psr规范对于开发可使用、可通用的代码来讲是必要(MUST)的。

logo-phpfig

Psr规范主要分为以下几个
Psr-0 : Autoloading standard
Psr-1 : Base coding standard
Psr-2 : Coding style guide
Psr-3 : Logger interface
Psr-4 : Improving autoloading
Psr-7 : Http message interface

之所以将Psr-0加上删除线是因为在2014年10月21日被废弃啦,Psr-0主要定义了autoload的老问题,但它已经被Psr-4替代了,具体请看Psr-0 自动加载规范

编码规范和引导 – Psr-1和Psr-2
每个人甚至每个公司或许都会有一套自己的编码规范,当然编码风格没有好坏之分,也就是通常说的,没有更好只有最好!PSR-1和PSR-2主要定义了一个标准的编码规范,之所以这么说,是因为毕竟这是由大多数PHP程序员投票的结果,所以绝对有参考价值!
[cc lang=”php” theme=”twitlight” width=”100%” height=”700″ lines=”40″ noborder=”true”]
$b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}

final public static function bar()
{
// method body
}
}
[/cc]

上面是一个遵循PSR代码规范的简短代码,关于更多细节,可以点击下面两个链接查看

PSR-1 基本代码规范
PSR-2 代码风格规范

Logger – Psr-3(可以参考下Laravel的Logger)
1.Psr\Log\AbstractLogger类可以让你通过继承它并实现通用的log方法来方便的实现LoggerInterface接口。而其他八个方法将会把消息和上下文转发给log方法。
2.类似的,使用Psr\Log\LoggerTrait只需要你实现通用的log方法。注意特性是不能用来实现接口的,所以你依然需要在你的类中implement LoggerInterface。
3.Psr\Log\NullLogger是和接口一起提供的。它在没有可用的日志记录器时,可以为使用日志接口的用户们提供一个后备的“黑洞”。但是,当context参数的构建非常耗时的时候,直接判断是否需要记录日志可能是个更好的选择。
4.Psr\Log\LoggerAwareInterface只有一个setLogger(LoggerInterface $logger)方法,它可以在框架中用来随意设置一个日志记录器。
5.Psr\Log\LoggerAwareTrait特性可以被用来在各个类中轻松实现相同的接口。通过它可以访问到$this->logger。
6.Psr\Log\LogLevel类拥有八个日志等级的常量。

LogLevel.php
[cc lang=”php” theme=”twitlight” width=”100%” height=”700″ lines=”40″ noborder=”true”]
命名空间、类及自动加载 – Psr-4
1.术语「类」是一个泛称;它包含类,接口,traits 以及其他类似的结构;
完全限定类名应该类似如下范例:
[cc lang=”php” theme=”twitlight” width=”100%” height=”700″ lines=”40″ noborder=”true”]
()*
[/cc]
2.
完全限定类名必须有一个顶级命名空间(Vendor Name);
完全限定类名可以有多个子命名空间;
完全限定类名应该有一个终止类名;
下划线在完全限定类名中是没有特殊含义的;
字母在完全限定类名中可以是任何大小写的组合;
所有类名必须以大小写敏感的方式引用;
3.当从完全限定类名载入文件时:
在完全限定类名中,连续的一个或几个子命名空间构成的命名空间前缀(不包括顶级命名空间的分隔符),至少对应着至少一个基础目录。
在「命名空间前缀」后的连续子命名空间名称对应一个「基础目录」下的子目录,其中的命名 空间分隔符表示目录分隔符。子目录名称必须和子命名空间名大小写匹配;
终止类名对应一个以 .php 结尾的文件。文件名必须和终止类名大小写匹配;
4.自动载入器的实现不可抛出任何异常,不可引发任何等级的错误;也不应返回值;
Example Implementations of PSR-4
1.闭包栗子
[cc lang=”php” theme=”twitlight” width=”100%” height=”700″ lines=”40″ noborder=”true”]
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:
*
* 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(‘\\’, ‘/’, $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;
}
}
[/cc]

摘自:http://www.php-fig.org/psr/psr-4/examples/

Psr
Tags:     

发表评论

电子邮件地址不会被公开。 必填项已用*标注