php标准规范详解
psr0:自动加载标准
已经被 psr4 替代,可以了解下
1. 强制:完全限定命名空间和类的格式:\<Vendor Name>\(<Namespace>\)*<Class Name>
2. 强制:每个命名空间必须有一个*命名空间 (Vendor Name)。
3. 每个命名空间中可以含有任意数量的子命名空间。
4. 当文件系统加载源文件时,命名空间之间的分隔符将被转换为 DIRECTORY_SEPARATOR。
5. 类名<Class Name>中的下划线 _ 都将被转换为 DIRECTORY_SEPARATOR。_ 没有什么特殊的意义。
6. 完全限定命名空间和类从文件系统加载源文件时将会加上 .php 后缀。
7. 完全限定命名空间中的字母大小写可以是任何组合。
实例
\Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php \Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php \Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php \Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php \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
psr1:基本编程规范
强制:php 标签必须是 <?php ?> 或者 <?= ?>2. 强制:文件必须以 不带BOM的 UTF-8 编码3. php 文件中的代码只能是定义类、函数、常量等声明,或者只能是一些副操作4. 命名空间和类必须满足 psr0 或者 psr45. 类名必须是 StudlyCaps 【大写开头的驼峰命名】规范6. 类中常量所有字母必须大写,下划线分隔7. 方法名称必须是 camelCase 驼峰命名规范。
解释
副操作包含却不仅限于:生成输出、直接的 require 或 include、连接外部服务、 修改 ini 配置、抛出错误或异常、修改全局或静态变量、读或写文件等。<?php// side effect: change ini settingsini_set('error_reporting', E_ALL);// side effect: loads a fileinclude "file.php";// side effect: generates outputecho "<html>\n";// declarationfunction foo(){ // function body}<?php// declarationfunction foo(){ // function body}// conditional declaration is not a side effectif (! function_exists('bar')) { function bar() { // function body } }
psr2 编程风格规范
是 psr1 的拓展
1. 必须遵循 psr12. 缩进必须使用 4 个空格符3. 每行的字符数应该软性保持在80个之内, 理论上一定不可多于120个, 但一定不能有硬性限制。4. 每命名空间声明语句和 use 声明语句块后面,必须插入一个空白行。所有 use 必须在 namespace 后声明。5. 方法和类的开始花括号必须写在其声明后另起一行。6. abstract 以及 final 必须在修饰符 private、protected 以及 public 之前,而 static 必须声明在访问修饰符之后。7. 控制结构的关键字后必须要有一个空格符,而调用方法或函数时则一定不能有。8. 控制结构的开始花括号必须写在声明的同一行。9. 控制结构的开始左括号后和结束右括号前,都一定不能有空格符。10. 所有PHP文件必须使用 Unix LF 作为行的结束符。
11. 所有PHP文件必须以一个空白行作为结束。12. 非空行后一定不能有多余的空格符。13. 每行一定不能存在多于一条语句。14. PHP所有 关键字必须全部小写。
实例
<?phpnamespace Vendor\Package;use FooInterface;use BarClass as Bar;use OtherVendor\OtherPackage\BazClass;class Foo extends Bar implements FooInterface{ public function sampleMethod($a, $b = null) { if ($a === $b) { bar(); } elseif ($a > $b) { $foo->bar($arg1); } else { BazClass::bar($arg2, $arg3); } } final public static function bar() { // method body } }
psr4 自动加载
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
注意:psr4 后不再叫完全限定命名空间,而是完全限定类名。1. 完全限定类名必须有一个*命名空间,被称为 "vendor namespace"2. 完全限定类名可以有有一个或多个子命名空间3. 完整的类名必须有一个最终的类名;4. 下划线都是没有特殊含义的5. 完整的类名可以由任意大小写字母组成;6. 所有类名都必须是大小写敏感的。7. 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应;8. 紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符。9. 末尾的类名必须与对应的以 .php 为后缀的文件同名。10. 自动加载器(autoloader)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。
实例
完整类名 | 命名空间前缀 | 文件基目录 | 文件路径 |
---|---|---|---|
\Acme\Log\Writer\File_Writer | Acme\Log\Writer | ./acme-log-writer/lib/ | ./acme-log-writer/lib/File_Writer.php |
\Aura\Web\Response\Status | Aura\Web | /path/to/aura-web/src/ | /path/to/aura-web/src/Response/Status.php |
\Symfony\Core\Request | Symfony\Core | ./vendor/Symfony/Core/ | ./vendor/Symfony/Core/Request.php |
\Zend\Acl | Zend | /usr/includes/Zend/ | /usr/includes/Zend/Acl.php |
相关推荐:
以上就是php标准规范详解的详细内容,更多请关注其它相关文章!