PHP是世界上最伟大的语言,这一点是毋庸置疑的吧。哈哈哈哈哈哈 。这个霸气的开头不错!(^__^)php
可是正是由于伟大,因此用的人也就多了,人一多,再牛逼再伟大的东西,都会产生问题,逐渐就形成了不少的分歧。每一个人的习惯不同,因此在一些PHP语法上的一些表现也是千差万别,好比这些问题:html
function 函数名是否驼峰命名
,
花括号{}是否换行写
,
是该写注释呢仍是不写
变量名是大写仍是小写
,
一个php文件中是一个类好仍是容许有多个
git
等等一系列的问题,接踵而至,你说你的这种方式屌,我说你傻逼啊个人才好。因此。各类争执声此起彼伏。程序员
特别是当你去接手上任留下的坑的时候,若是你有本身的规范或者你是处女座,你就会骂死那个狗日的一万遍了,每改一次就会改一遍骂:“麻痹的写的都是什么狗shit烂代码啊”。因此,在PHP程序员的心中一个共有的心愿诞生了:“能不能他妈的你们都遵照同一规范啊”。github
好,既然你们都有共同的心声,那么这样一个的公共的规范就出来了,他就是PSR-[0-4]规范,它出来后,你们都以为挺不错的啊,还蛮符合本身的书写风格的,渐渐的你们都知道了它,也慢慢的接受了它,愈来愈多的人知道了它,一些大牛的项目都慢慢的遵照了这个规范,而后也一帮菜鸟一看大牛都在用这个规范,我为啥不也尝试着规范一下呢?sql
因此,渐渐的PSR-[0-4]规范成为了PHP的一个王牌规范,你写PHP就最好必须按照这里面的规范写,全球共享好代码。apache
在说啥是PSR-[0-4]规范的以前,我以为咱们有必要说下它的发明者和规范者:PHP-FIG,它的网站是:www.php-fig.org。就是这个联盟组织发明和创造了PSR-[0-4]规范,膜拜吧,屌丝们!windows
FIG 是 Framework Interoperability Group(框架可互用性小组)的缩写,由几位开源框架的开发者成立于 2009 年,从那开始也选取了不少其余成员进来,虽然不是 “官方” 组织,但也表明了社区中不小的一块。组织的目的在于:以最低程度的限制,来统一各个项目的编码规范,避免各家自行发展的风格阻碍了程序设计师开发的困扰,因而大伙发明和总结了PSR,PSR是Proposing a Standards Recommendation(提出标准建议)的缩写,截止到目前为止,总共有5套PSR规范,分别是:闭包
PSR-0 (Autoloading Standard) 自动加载标准
PSR-1 (Basic Coding Standard) 基础编码标准
PSR-2 (Coding Style Guide) 编码风格向导
PSR-3 (Logger Interface) 日志接口
PSR-4 (Improved Autoloading) 自动加载的加强版,能够替换掉PSR-0了。框架
接下来的篇目,咱们会针对这5套,深刻了解下。仔细学习下受万千PHPer热捧的这5套规范到底有啥出众之处。
PRS-0规范是他们出的第1套规范,主要是制定了一些自动加载标准(Autoloading Standard),若是你英文比较好,能够直接看官网的这个:PSR-0,很短。可是若是,你英语烂成狗,那么就继续往下看个人瞎比比讲解吧!
咱们打开PSR-0的主页时,发现多了一个警告:
Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated. PSR-4 is now recommended as an alternative.
英语狗很差的,来,听我翻译:
不推荐使用 - 在2014年10月21日PSR-0已被标记为
过期
。PSR-4如今推荐做为替代。
那么也就是说PSR-0已!经!过!时!了!,别哭,PHP代码狗。虽然说已通过时,可是咱们也能够看看嘛,这不影响咱们的学习,好了。废话不说了,开始吧:
PSR-0强制性要求几点:
- 一个彻底合格的namespace和class必须符合这样的结构:“\< Vendor Name>(< Namespace>)*< Class Name>”
- 每一个namespace必须有一个顶层的namespace("Vendor Name"提供者名字)
- 每一个namespace能够有多个子namespace
- 当从文件系统中加载时,每一个namespace的分隔符(/)要转换成
DIRECTORY_SEPARATOR
(操做系统路径分隔符)- 在类名中,每一个下划线(_)符号要转换成
DIRECTORY_SEPARATOR
(操做系统路径分隔符)。在namespace中,下划线(_)符号是没有(特殊)意义的。- 当从文件系统中载入时,合格的namespace和class必定是以 .php 结尾的
- verdor name,namespaces,class名能够由大小写字母组合而成(大小写敏感的)
是否是有点看不懂啊。什么namespace啊,什么autoloading啊。因此,若是你对命名空间还不是特别懂的话,能够google下namespace 和 自动加载相关的php知识。或者看下一篇,我专门来说讲他们:namespace 和 autoloading
好,咱们接着一条条举例来分析下:
好比个人文件 /Doctrine/Common/IsolatedClassLoader.php
这样子的一个类文件,那么你的namespace命名就必须声明称这样:
声明:namespace \Doctrine\Common\ 调用:\Doctrine\Common\IsolatedClassLoader
其中,Doctrine 表示一个模块目录 Vendor name, common就是namesapce, IsolatedClassLoader是class name。这样一看就知道这个文件的目录层次,一目了然。
再好比:/path/to/project/lib/vendor/Symfony/Core/Request.php 文件:
声明:namespace \Symfony\Core 调用:\Symfony\Core\Request
namespace \Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php namespace \Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
必须有一个顶级的zend的namespace, zend 下面能够有message子命名空间。
看这个例子,咱们须要new 一个这样的类
new \Symfony\Core\Request
那么我再加载这个类文件时候,就要将分隔符\ 转换成 目录,也就是去 Vendor -> Symfony->Core->Request.php 一层层的目录找到这个文件。其实也就是和第1,2,3是反过来的对应关系。
第5条是说namespace命名中的这个 _符号 没有任何用处,就是用来表示目录分隔符的,可是注意在PRS-4中已经取消了这个_ ,那么咱们仍是看一下,这个过期的规定是怎么样的:
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php \namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
以上2个namespace中的_ 实际上是目录分隔符。并非class name就是那样的。如今PSR-4出来后,确实以为这样的规定有点很差。怪怪的。
第6条不用多说。既然你用php,文件名固然是得用.php 后缀结尾。这个规定的缘由,我大体猜一下,估计是有人用 .php3 后缀的。好吧。这个是个神话了。由于在apache的配置文件中是容许的:
<IfModule dir_module> DirectoryIndex index.php index.php3 index.html index.htm </IfModule>
因此,老老实实的用.php做为后缀名吧。
文件大小写的问题,这个实际上是很重要的。由于Linux系统下是区分文件名和目录名大小写的,而在Windows下是不区分的。因此就会常常出现问题,好比:
namespace \Doctrine\Common\IsolatedClassLoader
在Linux下就去严格按照大小写去找目录和文件了。可是若是你在windows下开发,全是小写也不会报错,你一发布到Linux上就悲剧了,提示找不到文件。因此,大小写过重要了。
仍是那句话,若是你英文比较好,能够直接看官网的这个:PSR-1,也不长,基本能看懂。可是若是你英语烂成狗,那么仍是请继续往下看个人瞎比比!
- PHP源文件
必须
只使用<?php
和<?=
这两种标签。- 源文件中php代码的编码格式
必须
是不带字节顺序标记(BOM)的UTF-8。- 一个源文件
建议
只用来作声明(类(class),函数(function),常量(constant)等)或者
只用来作一些引发反作用的操做(例如:输出信息,修改.ini配置等),但不建议
同时作这两件事。- 命名空间(namespace)和类(class) 必须遵照PSR-0标准。
- 类名(class name) 必须使用骆驼式(StudlyCaps)写法 (注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
- 类(class)中的常量必须只由大写字母和下划线(_)组成。
- 方法名(method name) 必须使用驼峰式(cameCase)写法。
好,就是上面的基本7大点,有些很简单,就不过多说明,第3点须要仔细说下。
这个基本都是你们都懂得的,PHP代码必须只使用长标签(<?php ?>
)或者短输出式标签(<?= ?>
);而不要使用其余标签。
之因此说这个,是由于咱们在学习PHP的时候,通常的教材都告诉咱们说,php有4种标记风格:php的4种标记风格 因此,不少人就乱来了。瞎鸡巴写。特别是asp风格的兼职是折磨好么!!!
这个很少说,保存的时候格式必须是无BOM的UTF-8格式,不然会出现不少没法解释的千奇百怪的问题。千万别傻逼的用windows下的text文本编辑器保存文件啊
这个通俗的说呢。就是别把一些输出和修改的操做(反作用
) 和 类文件混合在一块儿,专一一点,这个文件专门来声明class, 那个文件专门来修改配置文件,别混在一块儿写:
因此,如下的这个文件是有问题的,最好不要这样:
// 反作用:修改了ini配置 ini_set('error_reporting', E_ALL);
// 反作用:载入了文件 include "file.php";
// 反作用:产生了输出 echo "<html>\n";
// 声明 function function foo() { // 函数体 }
你看上面看起来多乱啊。最好所有分开来写:
namespace Lib; className { publicfunction __construct() { echo __NAMESPACE__ ."<br>"; }
publicstaticfunction test() { echo __NAMESPACE__ .' static function test <br>'; } }
修改ini:
ini_set('error_reporting', E_ALL); // require 文件: require DIR .'/loading.php'; spl_autoload_register("\\AutoLoading\\loading::autoload");
你看是否是整齐好看多了。固然这个是很难约束的。本身仔细划分。
第4条是约束namespace的,前面已经说过,很少说。值得说的是名字要是驼峰方式来
class name必需要用驼峰方式写,驼峰又分小驼峰和大驼峰(小驼峰是第一个字母是小写)这样写看着舒服也比较规范,不作要求,反正是驼峰就能够了。我喜欢用小驼峰:
class getUserInfo { }
是规定类中的常量名(const)
声明必需要所有大小
,若是有多个单词,就用_
分开:
class getUserInfo { //所有大写 const NAME ='phper'; //用_隔开 const HOUSE_INFO ='已经大上海买房' publicfunction getUserName() { // } }
method name必需要用驼峰方式写,大小驼峰均可以,不作要求,我喜欢用小驼峰:
class getUserInfo { publicfunction getUserName() { // } }
PSR-2 规范的官网连接在此:PSR-2 这一规范主要是约束代码风格的,但是说是全部里面最关键最重要的,也是须要好好规范和共同遵照的。
咱们一个个来看下,只能我大略的写一些比较重要的,或者说平时用的最多的。
?>
必须省略。第3点实际上是蛮重要的,我以前还老写闭合,如今不写了。这能够避免在 PHP 结束标记以后万一意外加入了空格或者换行符,会致使 PHP 开始输出这些空白,而脚本中此时并没有输出的意图。
必须使用4个空格来缩进,不能使用Tab键。固然你若是把Tab在编辑器里手动设置为4个空格也能够。这样的目的是由于:每一个人的机器上的Tab键都不同,有些是4个空格,有些是8个空格,在你的机器上看着很爽的代码,在别人机器上了就各类恶心了。因此,统一搞成4个空格,无论在哪里打开都是美观的。
一行推荐的是最多写80个字符,多于这个字符就应该换行了,通常的编辑器是能够设置的。
php的关键字,必须小写,boolean值:true,false,null 也必须小写
下面是php的keyword,必须小写。
'__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'
先简单文字描述下:
用代码来讲明下:
<?php namespaceLib\Databases;//下面必须空格一行 classMysql{ }
namespace下空一行,才能使用use,再空一行,才能声明class
<?php namespaceLib\Databases;// 下面必须空格一行 useFooInterface;//use 必须在namespace 后面声明 useBarClassasBar; useOtherVendor\OtherPackage\BazClass;// 下面必须空格一行 classMysql { }
1 . 继承(extends) 和实现(implement) 必须和 class name 写在一行,切花括号要换行写。
<?php namespaceLib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 写一行 { //换行写{ }
2 . 属性(property)必须声明其可见性,究竟是 public
仍是protected
仍是 private
,不能省略,也不能使用var
, var是php老版本中的什么方式,等用于public.
<?php namespaceLib\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)
, 若是参数有默认值,也要用左右空格
分开。
<?php namespaceLib\Databaes; class Mysql extends ParentClass implements \PDO, \DB // 写一行 { public getInfo ($name, $age, $gender =1)//函数名getInfo和(之间有个空格,参数之间也要有空格。默认参数也要左右都有空格 {//必须换行写{ } }
4 . 当用到抽象(abstract)和终结(final)来作类声明时,它们必须放在可见性声明 (public
仍是protected
仍是 private
)的前面。而当用到静态(static)来作类声明时,则必须放在可见性声明的后面。
直接上代码:
<?php namespaceVendor\Package; abstract classClassName { protectedstatic $foo;//static放后面 abstract protected function zim();//abstract放前面 final publicstatic function bar()//final放前面,static放最后。 { // 方法主体部分 } }
控制接口,就是if
else
while
switch
等。这一类的写法规范也是常常容易出现问题的,也要规范一下。
1 . if,elseif,else写法,直接上规范代码吧:
<?php if ($expr1) {//左右空格 // if body } elseif ($expr2){//elesif 连着写 // elseif body }else{ // else body; }
2 . switch
,case
注意左右空格和换行,仍是直接上规范代码:
<?php switch ($expr) {//左右空格 case0: echo 'First case, with a break';//对其 break;//换行写break ,也对其。 case1: echo 'Second case, which falls through'; // no break case2: case3: case4: echo 'Third case, return instead of break'; return; default: echo 'Default case'; break; }
3 . while
,do while
的写法也是相似,要左右空格,上代码:
<?php while ($expr) {//左右空格 // structure body } do {// structure body; //左右空格 } while ($expr);
4 . for
的写法
<?php for($i =0; $i <10; $i++) {//注意几个参数之间的空格 // for body }
5 . foreach
的写法
<?php foreach ($iterable as $key => $value) {//仍是空格问题 // foreach body }
6 . try catch
的写法
<?php try{ // try body } catch (FirstExceptionType $e) {//一样也是注意空格。 // catch body } catch(OtherExceptionType $e) { // catch body }
基本用到的就是这些了,其余什么闭包啥的用的很少就不过多的累述了。
PSR-3规范主要是来规范日志接口(Logger Interface)的,老实讲,其实日常接触的不是特别多,因此就不说了,能够去看官网的PSR-3
PSR-4规范是刚出没多久的一条新的规范,它也是规范 自动加载(autoload)的,是对PSR-0的修改,属于补充规范,
我简单说下,主要是如下几点:
1. 废除了PSR-0中_
就是目录分割符的写法,_
下划线在彻底限定类名中是没有特殊含义了。
2. 类文件名要以 .php 结尾。
3. 类名必需要和对应的文件名要如出一辙,大小写也要如出一辙。