PSR-1 Basic Coding Standard(译)-- 基础编码规范

大力金刚
• 阅读 2895

注:本文算是笔者对PSR规范翻译/学习笔记,之后会陆续翻译剩余的规范,可能翻译的有错误的地方,希望读者能够指正,非常感谢.

什么是PSR?

      PSR是PHP Standards Recommendations(PHP标准建议) 的简写,是由PHP-FIG组织(PHP Framework Interop Group-PHP框架交互操作组织)提出。PHP-FIG的工作是寻找项目之间的共性,以及让开发者能更好协同工作的方式。读者可能在浏览一些PHP技术文章的时候,可能会看到PSR-1,PSR-2,PSR-4,PSR-7等,这些是PHP-FIG的标准建议,这些标准建议的命名构成是以'PSR-'+'序号',每个PHP_FIG标准建议都是为了解决大部分框架频繁遇到的一个特定的问题,而与此同时框架不需要自己再去重复解决问题,而是遵循PSR标准建议,采纳共享的解决方案.

目前PSR规范有哪些?

PSR规范

  • PSR-1: Basic Coding Standard
  • PSR-2: Coding Style Guide
  • PSR-3: Logger Interface
  • PSR-4: Autoloader
  • PSR-6: Caching Interface
  • PSR-7: HTTP message interfaces
  • PSR-11: Container interface
  • PSR-13: Link definition interfaces
  • PSR-16: Common Interface for Caching Libraries

什么是 PSR-1?

原文链接:PSR-1 Basic Coding Standard

Aims to ensure a high level of technical interoperability between shared PHP code.

PSR-1 就是为了能够使共享的PHP代码之间有高度的互操作性.

OverView (概览)

  • PHP文件(MUST)必须只使用<?php 和 <?= 标签.
  • PHP文件(MUST)必须只能使用无BOM头的UTF-8编码格式.
  • PHP文件(SHOULD)应该要么声明 classe,functions。constants 等等,或者 general ouput(通用输出?),改变php.ini的配置等等,但是(SHOULD Not)不应该两个都有.
  • 命名空间和类(MUST)必须要遵循自动加载的PSR规范[PSR-0,PSR-4];
  • 类名明明(MUST)必须以大驼峰式.
  • 类中的常量的命名(MUST)必须为以下划线分割的大写字母.
  • 方法名(MUST)必须为小驼峰式.

PHP Tags

PHP代码(MUST)必须使用长标签<?php ?> 或者 短标签 <?= ?>;(MUST NOT)不能有其他类型的写法.

Character Encoding

PHP代码(MUST)必须只使用无BOM头的UTF-8编码格式.

Side Effects

     一个PHP文件(SHOULD)必须要声明一些class,function,constant等,并且没有side effects (执行逻辑),或者(SHOULD)应该有side effects(执行逻辑),但是(SHOULD NOT)不应该两个都同时存在.

   'side effects'代表的就是和声明class,function,constant等不直接相关联的执行逻辑,仅仅来自这个包含的文件。

  'Side effects' 包含以下操作,但不仅限于此:general output(通用输出), 'require'和'include'的使用,连接外部服务,修改php.ini的设置,触发错误或者抛出异常,修改全局或者静态变量,读取或者写入文件操作等等.

  以下是一个我们要避免的例子,就是一个具有'declarations'和side effects的PHP文件。

<?php
// side effect: change ini settings
ini_set('error_reporting', E_ALL);

// side effect: loads a file
include "file.php";

// side effect: generates output
echo "<html>\n";

// declaration
function foo()
{
    // function body
}

以下是一个是正确的例子,只包含了'declaraion'没有'side effects'.

<?php
// declaration
function foo()
{
    // function body
}

// conditional declaration is *not* a side effect
if (! function_exists('bar')) {
    function bar()
    {
        // function body
    }
}

Namespace and Class Names

This means each class is in a file by itself, and is in a namespace of at least one level: a top-level vendor name

   命名空间和类(MUST)必须要遵循自动加载规范【PSR-0,PSR-4】,这意味着每个类在一个文件中,并且至少在一个level的命名空间中:最高level的vendor名称.

   类名命名必须以大驼峰式.

   PHP5.3及以后版本中,写代码(MUST)必须使用正式的命名空间.

For example:

<?php
// PHP 5.3 and later:
namespace Vendor\Model;

class Foo
{
}

   PHP5.2.x以及之前的版本(SHOULD)应该使用pseudo-namespacing(伪命名空间)的惯例:在类名前+'Vendor_'前缀.

<?php
// PHP 5.2.x and earlier:
class Vendor_Model_Foo
{
}

The term “class” refers to all classes, interfaces, and traits.

本文中的术语class,代表的是所有的class,interface,traits。

Constants

类中的常量(MUST)必须为以下划线分割的大写字母.
for example:

<?php
namespace Vendor\Model;

class Foo
{
    const VERSION = '1.0';
    const DATE_APPROVED = '2012-06-01';
}

Properties

对于类的属性,本文档有意省略了对属性名的命名方式.(大驼峰/小驼峰/下划线等)

无论采用什么样的命名方式(SHOULD)应该和其所在scope相一致.scope 可能为vendor级别,package级别,class级别,或者method级别.

Methods

方法名(MUST)必须声明为小驼峰式.

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
4年前
PSR 类自动加载规范的翻译与看法
先列举一些资源:PSR0官网原文(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.phpfig.org%2Fpsr%2Fpsr0%2F)PSR的Github源(https://www.oschina.net/action/GoToLink?urlh
Stella981 Stella981
4年前
Servlet3.1规范翻译
https://github.com/javahongxiServlet接口是JavaServletAPI的核心抽象。所有Servlet类必须直接或间接的实现该接口,或者更通常做法是通过继承一个实现了该接口的类从而复用许多共性功能。目前有GenericServlet和HttpServlet这两个类实现了Servlet接口。大多数情况下,开发者只需要继
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
分布式系统的主键生成方案对比 | 京东云技术团队
UUID​UUID(通用唯一识别码)是由32个十六进制数组成的无序字符串,通过一定的算法计算出来。为了保证其唯一性,UUID规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。
大力金刚
大力金刚
Lv1
慊慊思归恋故乡,君为淹留寄他方。
文章
3
粉丝
0
获赞
0