PHP中PSR[0-4]代码规范

php-fig

1、FIG:PSR[0-4]代码规范的得发明者、规范者,framework interoperability group

2、PSR:提出标准建议,proposing a standards recommendation

PSR-0 Autoloading Standard

规范一

一个完全合格的namespace和class必须符合这样的结构:"< Vendor Name>(< Namespace>)*< Class Name>"

例如:\China\Jiangxi\School\User.php

China 表示Vendor Name

\Jiangxi\Scholl 表示Namespace

User 表示Class Name

规范二

每个namespace必须有一个顶层namespace

例如:\China\Jiangxi\School\User.php

China 为顶层namespace

规范三

namespace可以有多个子命名空间

例如:\China\Jiangxi\School和\China\Jiangxi\Family

School 和 Family 为\China\Jiangxi的子命名空间

规范四

文件系统加载时,每个namespace的分隔符要转换成DIRECTORY_SEPARATOR(目录分隔符)

例如:\China\Jiangxi\School和\China\Jiangxi\Family

School 和 Family 为\China\Jiangxi的子命名空间

规范五

在类名中,每个下划线(_)符号要转换成DIRECTORY_SEPARATOR(操作系统路径分隔符)。在namespace中,下划线(_)符号是没有(特殊)意义的

已经弃用

规范六

文件后缀必须为.php

规范七

vendor name、namespaces、class名可以由大小写组成,且区分字母大小写

PSR-1 Basic Coding Stantard

规范一

php源文件必须只使用

规范二

源文件必须为不带字节顺序标记(BOM)的UTF-8

规范三

一个源文件建议只做声明(class、function、const)或者只做一些引起副作用的操作(输出信息、修改.ini配置等),不建议同时做这两件事

规范四

命名空间和类必须遵循PSR-0

规范五

类名必须使用骆驼式写法(ClassName)

规范六

类中的常量必须只由大写字母和下划线组成

规范七

方法名必须使用驼峰式写法(functionName)

PSR-2 Coding Style Guide

源文件

1、文件末尾必须空一行

2、必须使用Unix LF(换行)作为行结束符

3、纯PHP代码的源文件的关闭标签?>必须省略()

缩进

必须使用4个空格来缩进

一行推荐的是最多写80个字符,多于这个字符就应该换行了,一般的编辑器是可以设置的

关键字和 True/False/Null

php的关键字,必须小写,boolean值:true,false,null 也必须小写

'__halt_compiler', 'abstract', 'and', 'array', 'as', 'break',

'callable', 'case', 'catch', 'class', 'clone', 'const', 'continue',

'declare', 'default', 'die', 'do', 'echo', 'else', 'elseif', 'empty',

'enddeclare', 'endfor', 'endforeach', 'endif', 'endswitch',

'endwhile', 'eval', 'exit', 'extends', 'final', 'for', 'foreach',

'function', 'global', 'goto', 'if', 'implements', 'include',

'include_once', 'instanceof', 'insteadof', 'interface', 'isset',

'list', 'namespace', 'new', 'or', 'print', 'private', 'protected',

'public', 'require', 'require_once', 'return', 'static', 'switch',

'throw', 'trait', 'try', 'unset', 'use', 'var', 'while', 'xor'

命名空间、namespace导入

1、命名空间声明之后,必须有一行空行

2、所有的导入(use)必须放在命名空间后面

3、在导入(use)声明代码块后面必须有一行空行


namespace Lib\Databases; // 下面必须空格一行

use FooInterface; // use 必须在namespace 后面声明

use BarClass as Bar;

use OtherVendor\OtherPackage\BazClass; // 下面必须空格一行

class Mysql

{

}

类(class),属性(property)和方法(method)

1、继承(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写


namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB // 写一行

{ // 换行写{

}

2、属性(property)必须声明其可见性,到底是 public 还是 protected 还是 private,不能省略,也不能使用var, var是php老版本中的什么方式,等用于public


namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB // 写一行

{

public $foo = null;

private $name = 'yangyi';

protected $age = '17';

}

3、方法(method),必须 声明其可见性,到底是 public 还是 protected 还是 private,不能省略。并且,花括号{必须换行写。如果有多个参数,第一个参数后紧接, ,再加个空格,且函数name和( 之间必须要有个空格:function_name ($par, $par2, $pa3), 如果参数有默认值,也要用左右空格分开


namespace Lib\Databaes;

class Mysql extends ParentClass implements \PDO, \DB // 写一行

{

public getInfo ($name, $age, $gender = 1) // 函数名getInfo和(之间有个空格,参数之间也要有空格。默认参数也要左右都有空格

{ // 必须换行写 {

}

}

4、当用到抽象(abstract)和终结(final)来做类声明时,它们必须放在可见性声明 (public 还是protected还是private)的前面。而当用到静态(static)来做类声明时,则必须放在可见性声明的后面


namespace Vendor\Package;

abstract class ClassName

{

protected static $foo; // static放后面

abstract protected function zim(); // abstract放前面

final public static function bar() // final放前面,static放最后。

{

// 方法主体部分

}

}

控制结构

1、if,elseif,else写法


if ($expr1) { // 左右空格

// if body

} elseif ($expr2) { // elesif 连着写

// elseif body

} else {

// else body;

}

2、switch,case 注意左右空格和换行


switch ($expr) { // 左右空格

case 0:

echo 'First case, with a break'; // 对齐

break; // 换行写break,也对齐。

case 1:

echo 'Second case, which falls through';

// no break

case 2:

case 3:

case 4:

echo 'Third case, return instead of break';

return;

default:

echo 'Default case';

break;

}

3、while,do while 的写法


while ($expr) { // 左右空格

// structure body

}

do {

// structure body; // 左右空格

} while ($expr);

4、for的写法


for ($i = 0; $i < 10; $i++) { // 注意几个参数之间的空格

// for body

}

5、foreach的写法


foreach ($iterable as $key => $value) { // 还是空格问题

// foreach body

}

6、try catch的写法


try {

// try body

} catch (FirstExceptionType $e) { // 同样也是注意空格。

// catch body

} catch (OtherExceptionType $e) {

// catch body

}

Logger Interface 规范日志接口

LoggerInterface


namespace Psr\Log;

/**

* 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.

*/

interface LoggerInterface

{

/**

* System is unusable.

*

* @param string $message

* @param array $context

* @return null

*/

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 null

*/

public function alert($message, array $context = array());

/**

* Critical conditions.

*

* Example: Application component unavailable, unexpected exception.

*

* @param string $message

* @param array $context

* @return null

*/

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 null

*/

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 null

*/

public function warning($message, array $context = array());

/**

* Normal but significant events.

*

* @param string $message

* @param array $context

* @return null

*/

public function notice($message, array $context = array());

/**

* Interesting events.

*

* Example: User logs in, SQL logs.

*

* @param string $message

* @param array $context

* @return null

*/

public function info($message, array $context = array());

/**

* Detailed debug information.

*

* @param string $message

* @param array $context

* @return null

*/

public function debug($message, array $context = array());

/**

* Logs with an arbitrary level.

*

* @param mixed $level

* @param string $message

* @param array $context

* @return null

*/

public function log($level, $message, array $context = array());

}

Psr\Log\LoggerAwareInterface


namespace Psr\Log;

/**

* Describes a logger-aware instance

*/

interface LoggerAwareInterface

{

/**

* Sets a logger instance on the object

*

* @param LoggerInterface $logger

* @return null

*/

public function setLogger(LoggerInterface $logger);

}

Psr\Log\LogLevel


namespace Psr\Log;

/**

* Describes log levels

*/

class LogLevel

{

const EMERGENCY = 'emergency';

const ALERT    = 'alert';

const CRITICAL  = 'critical';

const ERROR    = 'error';

const WARNING  = 'warning';

const NOTICE    = 'notice';

const INFO      = 'info';

const DEBUG    = 'debug';

}

Autoloader

类名必须要和对应的文件名要一模一样,大小写也要一模一样

类文件名要以 .php 结尾

废除了PSR-0中就是目录分割符的写法,下划线在完全限定类名中是没有特殊含义

实例

FULLY QUALIFIED CLASS NAMENAMESPACE PREFIXBASE DIRECTORYRESULTING FILE PATH

\Acme\Log\Writer\File_WriterAcme\Log\Writer./acme-log-writer/lib/./acme-log-writer/lib/File_Writer.php

\Aura\Web\Response\StatusAura\Web/path/to/aura-web/src//path/to/aura-web/src/Response/Status.php

\Symfony\Core\RequestSymfony\Core./vendor/Symfony/Core/./vendor/Symfony/Core/Request.php

\Zend\AclZend/usr/includes/Zend//usr/includes/Zend/Acl.php

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,494评论 18 139
  • 什么是psr-0,psr-1,psr-2标准 FIG组织在制定跟PHP相关规范,简称PSR,PSR旨在通过讨论我们...
    meng_philip123阅读 1,625评论 0 2
  • 整理自 PHP 标准规范 作为程序员来说,采用统一的编码风格是非常重要的。这将给未来代码的编写、阅读节省大量时间。...
    野尘lxw阅读 698评论 0 2
  • 把当前目录作为Root Document只需要这条命令即可:php -S localhost:3300 也可以指定...
    绚烂的时光阅读 723评论 0 1
  • 原文: https://github.com/ecomfe/spec/blob/master/javascript...
    zock阅读 3,369评论 2 36