PSR

摘要:
PSR-1PHP标签:PHP代码必须放在˂?起始大括号不需要另起新行,详细的如下代码:$closureWithArgs=function{//body};$closureWithArgsAndVars=functionuse{//body};PSR-3规定了一套通用的日志记录器接口为了符合PSR-3规范,框架必须实现该规范中的接口,这样可以更多的兼容第三方应用。PSR-3规范中包含了9个方法,每个方法都对应了RFC5424协议的一个日志级别,而且都接受两个参数$message和$context˂?

PSR是PHP Standards Recommendation的简称,这个是php-fig组织制定的一套规范

PSR-1

PHP标签:
PHP代码必须放在<?php ?>标签或<?= ?>标签中。

编码:
PHP文件必须使用无BOMUTF-8编码。

副作用:
一个PHP文件可以定义符号(比如类、函数、常量等),或者执行只有唯一副作用的操作(比如输出结果、处理数据等),但是不能同时做这两件事,尽量是一个PHP文件的功能单一。在操作的时候尽量把变量、类、函数的声明分开,通过includerequire文件的方式来使用。(一个PHP文件一个作用)

类的名称:
每个类都有自己的命名空间,且都在顶级命名空间下,类名必须使用驼峰式CamelCase

常量:

常量必须全部是用大写,并且使用下划线(_)分开
类的方法:
类的方法必须使用小写字母开头的驼峰式(camelCase)命名
PSR-2
PHP文件必须使用Unix风格的换行符(LF, linefeed),最后要有一个空行,每行代码不应该超过80个字符,每行末尾不能有空格,每行只能有一条语句,可以在适当的地方添加空行提高代码的阅读性
不加上?>关闭标签,可以避免意料之外的输出错误,如果加上关闭标签,且在关闭标签后有空行,那么空行会被当成输出,导致意想不到的错误。
缩进:
必须以4个空格为缩进,不能使用制表符(Tab键)缩进。
关键字:
PHP的关键字必须使用小写,而且true,false, 和null也必须小写
命名空间和use声明:
现在,namespace声明之后必须要有一个空行,而且use声明必须放在namespace之后,必须分别使用use引入命名空间,而且use后要有空行
namespace VendorPackage;

useFooClass;
use BarClass asBar;
useOtherVendorOtherPackageBazClass;

//... additional PHP code ...

类的继承和实现:
extendsimplements关键字必须和类名在同一行,类、接口和Traits定义体的起始括号应该在类名之后新起一行,结束括号也必须新起一行,例如

namespace VendorPackage;

useFooClass;
use BarClass asBar;
useOtherVendorOtherPackageBazClass;

class ClassName extends ParentClass implements ArrayAccess,Countable
{
    //constants, properties, methods
}

如果implements后面后很多类导致一行很长,可以依次将需要的类另起新行并缩进4个空格

namespace VendorPackage;

useFooClass;
use BarClass asBar;
useOtherVendorOtherPackageBazClass;

class ClassName extends ParentClass implementsArrayAccess,Countable,Serializable
{
    //constants, properties, methods
}

可见性:
类中的每个属性和方法都要声明可见性,有publicprivateprotected,不能使用var关键词来声明,老版本的PHP会在私有属性前加上_,一行只能声明一个属性

方法:
类中的所有方法也应该定义可见性,方法名后面不能有空格,方法体的括号位置和类定义体的括号位置一样,都要新起一行,结束括号也要新起一行。方法参数的起始圆括号之后没有空格,结束括号之前也没有空格,有多个参数是,每个参数的逗号后面加一个空格,例如:

namespace VendorPackage;

classClassName
{
    public function fooBarBaz($arg1, &$arg2, $arg3 =[])
    {
        //method body
}
}

如果参数比较多,需要换行时,可以如下

namespace VendorPackage;

classClassName
{
    public functionaVeryLongMethodName(
        ClassTypeHint $arg1,
        &$arg2,
        array $arg3 =[]
    ) {
        //method body
}
}

abstractfinalstatic
现在,abstractfinal必须在可见性修饰符之前,static声明必须放在可见性修饰符之后,例如:

namespace VendorPackage;

abstract classClassName
{
    protected static $foo;

    abstract protected functionzim();

    final public static functionbar()
    {
        //method body
}
}

方法和函数的调用:
在调用方法和函数时,圆括号必须跟在函数名之后,函数的参数之间有一个空格:

bar();
$foo->bar($arg1);
Foo::bar($arg2, $arg3);

如果参数比较多,一行放不下时,如下处理:

$foo->bar(
    $longArgument,
    $longerArgument,
    $muchLongerArgument);
PHP的控制结构:
PHP的控制结构包括if、else、elseif、switch、case、while、do while、for、foreach、try和catch。如果这些关键词后面有一对原括号,开始括号前必须有一个空格,与方法和类的定义体不同,控制结构关键词后面的起始括号应该和控制结构关键词写在同一行,例如
$gorilla = newAnimalsGorilla;
$ibis = newAnimalsStrawNeckedIbis;

if ($gorilla->isWake() === true) {
    do {
        $gorilla->beatChest();
    } while ($ibis->isAsleep() === true);
    
    $ibis->flyAway();
}

PHP闭包函数:
闭包函数在声明时,function关键词后必须有一个空格,同时use关键词前后也必须有一个空格。起始大括号不需要另起新行,详细的如下代码:

$closureWithArgs = function ($arg1, $arg2) {
    //body
};

$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {
    //body
};

PSR-3规定了一套通用的日志记录器接口

为了符合PSR-3规范,框架必须实现该规范中的接口,这样可以更多的兼容第三方应用。PSR-3规范中包含了9个方法,每个方法都对应了RFC 5424协议的一个日志级别,而且都接受两个参数$message$context

<?php

namespace PsrLog;

/**
 * Describes a logger instance
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data, the only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
interfaceLoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function emergency($message, array $context = array());

    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function alert($message, array $context = array());

    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function critical($message, array $context = array());

    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function error($message, array $context = array());

    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function warning($message, array $context = array());

    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function notice($message, array $context = array());

    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function info($message, array $context = array());

    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array $context
     * @return void
     */
    public function debug($message, array $context = array());

    /**
     * Logs with an arbitrary level.
     *
     * @param mixed $level
     * @param string $message
     * @param array $context
     * @return void
     */
    public function log($level, $message, array $context = array());
}

关于message参数:

$message必须是一个字符串或者是含有__toString()方法的对象,$message应该包含占位符,例如{placeholder_name},占位符由{、占位符名称和}组成,不能包含空格,占位符名称可以由A-Z, a-z, 0-9, _组成,第三方实现可以用$context参数来替换占位符,占位符名称必须$context数组的key对应。如下例子是使用$context中的值替换$message中的占位符:

/**
 * Interpolates context values into the message placeholders.
 */
function interpolate($message, array $context = array())
{
    //build a replacement array with braces around the context keys
    $replace = array();
    foreach ($context as $key => $val) {
        //check that the value can be casted to string
        if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
            $replace['{' . $key . '}'] = $val;
        }
    }

    //interpolate replacement values into the message and return
    return strtr($message, $replace);
}

//a message with brace-delimited placeholder names
$message = "User {username} created";

//a context array of placeholder names => replacement values
$context = array('username' => 'Bolivar');

//echoes "User Bolivar created"
echo interpolate($message, $context);

关于context参数:

$context是一个数组参数,用于构造复杂的日志消息,$context中的值不能跑出任何PHP异常或错误。如果$context中包含Exception对象,则该对象的key必须为exception

PSR-4
PSR-4规范描述了一个标准的自动加载器策略,指在运行时按需查找PHP类、接口或Traits。支持PSR-4自动加载器标准的PHP组建和框架,使用同一个自动加载器就能找到相关代码,然后将其载入PHP解释器。有了这个功能,就可以把现代PHP生态系统中很多客户操作的组件联系起来。
/**
 * 使用SPL组册这个自动加载函数后,遇到下述代码时这个函数会尝试   从/path/to/project/src/Baz/Qux.php文件中加载FooBarBazQux类:
 *  new FooBarBazQux;
 * @param string $class 完全限定的类名。
 * @return void
 **/spl_autoload_register(function ($class) {
    //项目的命名空间前缀
    $prefix = 'Foo\Bar\';
    
    //目录前缀对应的根目录
    $base_dir = __DIR__ . '/src/';
    
    //判断传入的类是否使用了这个命名空间前缀
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) !== 0) {
        //没有使用,交给注册的下一个自动加载器处理
        return;
    }
    
    //获取去掉前缀后的类名
    $relative_class = substr($class, $len);
    
    //把命名空间前缀替换成根目录,
    // 在去掉前缀的类名中,把命名空间分隔符替换成目录分隔符,
    // 然后在后面加上.php
    $file = $base_dir . str_replace('\', '/', $relative_class) . '.php';
    
    //如果该文件存在,就将其导入
    if (file_exists($file)) {
        require $file;
    }
});

先记着,后续再理解!


原文地址:https://www.jianshu.com/p/b33155c15343

免责声明:文章转载自《PSR》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Hadoop完全分布式模式安装部署Python实现网页自动化-浏览器查找元素(二)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Pike学习笔记

  Pike的安装(Ubuntu环境)    pike的语法非常像C++,但是它也是脚本语言,所以具有一般脚本语言的特性。一个简单的pike程序,hello world: 1 int main() 2 { 3 write("Hello world! "); 4 return 0; 5 }    string的用法,及命令行参数的例子: #!...

CentOS 7.8 搭建LNMP(Linux+Nginx+MySQL+PHP)

安装前的准备-配置selinux和防火墙 1,临时(永久)关闭selinux 为什么要关闭selinux(centos默认开启的安全加强的linux,详细问度娘),避免selinux的默认文件权限的限制,导致安装失败。操作如下:查看SELinux状态命令:命令:/usr/sbin/sestatus -v如果SELinux status参数为enabled即...

Java中的ASCII、Unicode和UTF-8字符编码集

原文:@http://kxjhlele.iteye.com/blog/333211 首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示2...

在Android里完美实现基站和WIFI定位

来自:http://www.cnblogs.com/coffeegg/archive/2011/10/01/2197129.html 众所周知的,在OPhone和大部分国产的Android定制机里不支持最简单实用的基站和WIFI定位,只能使用速度慢而耗电的GPS定位,但OPhone和华为/中兴生产的一些Android定制机却占据了一定的市场,因此导致了...

Java 音频加水印

先解释一下什么是音频加水印: 音频加水印就是在一段音频中通过混音加入另一段音频,目的是让音频可以公开分享并有效保护原创。 本文主要纪录自己关于给音频加水印的技术调研。 开发语言:Java,开发所处系统环境Mac 使用了开源软件:FFmpeg 4.2.4 FFmpeg官网下载链接:https://ffmpeg.org/download.html#build-...

Android 换肤功能的实现(Apk插件方式)

一、概述 由于Android 没有提供一套统一的换肤机制,我猜可能是因为国外更注重功能和体验的原因 所以国内如果要做一个漂亮的换肤方案,需要自己去实现。 目前换肤的方法大概有三种方案: (1)把皮肤资源文件内置于应用程序Apk的资源目录下,这种方案最简单,但是导致apk安装包比会比比较大,而且不好管理 (2)将皮肤资源文件打包成zip的资源文件方式提供,该...