手写PHP API框架(一)之PSR规范
时间:2023-02-10 10:37
本篇文章给大家带来了关于php的相关知识,其中主要跟大家聊一聊编码规范,也建议大家在开发中尽量遵循规范,感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。 希望能帮助能让你快速地搭建一个自己的框架,能给你的工作或者学习中带来一定的帮助与启发。 PSR规范 composer的使用 快速搭建一个API接口框架 Redis各种数据类型的应用 缓存应用分析 在开发框架之前,我来介绍框架开发遵循的规范。 大多数编程语言都有自己的一套编码规范,作为“世界上最好的语言”,PHP当然也有自己的编码规范。这个规范就是PHP Standard Recommendation(简称PSR)。 当然,从我自己的工作中,我发现很多PHP程序员尤其是初级程序员,是不知道PHP是有这么一个规范的,我认为这是不科学的。 什么是PSR? 介绍PSR之前需要介绍一下制定此规范的组织-----PHP-FIG,全称是PHP Framework Interoperability。 组织成员制定规范,并且落实在自己的项目中,虽然不是官方组织,但也代表了大部分PHP社区项目,如CakePHP,Composer,Drupal,PEAR,Slim,Yii framework,Zend Framework等。并且有越来越多的项目加入并遵循此标准。 PSR项目的目的在于:通过框架作者或者框架的代表之间讨论,以最低程度的限制,制定一个协作标准,各个框架遵循统一的编码规范,让工程师一起更好协同工作。 截止目前,已经官网已有20条列出,除去起草中和舍弃的,有以下13条。 我们不妨来看看这些规范: PSR-1 基础编码规范 PSR-12 代码风格规范 PSR-12的规范很细致,包含了声明、命名空间、类及继承以及控制结构等说明。 我们先来看一个demo: 代码风格规范内容很多,这里就不一一说明了,大家可自行阅读 PSR-4 自动加载 关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路径规范。 此处的“类”泛指所有的class类、接口、traits可复用代码块以及其它类似结构。 一个完整的类名需具有以下结构: 完整的类名必须要有一个顶级命名空间,被称为 "vendor namespace"; 完整的类名可以有一个或多个子命名空间; 完整的类名必须有一个最终的类名; 完整的类名中任意一部分中的下划线都是没有特殊含义的; 完整的类名可以由任意大小写字母组成; 所有类名都必须是大小写敏感的。 当根据完整的类名载入相应的文件…… 完整的类名中,去掉最前面的命名空间分隔符,前面连续的一个或多个命名空间和子命名空间,作为“命名空间前缀”,其必须与至少一个“文件基目录”相对应; 紧接命名空间前缀后的子命名空间必须与相应的”文件基目录“相匹配,其中的命名空间分隔符将作为目录分隔符。 末尾的类名必须与对应的以 自动加载器(autoloader)的实现一定不能抛出异常、一定不能触发任一级别的错误信息以及不应该有返回值。 下表展示了符合规范完整类名、命名空间前缀和文件基目录所对应的文件路径。 暂且只介绍这比较常用的三个规范。 更多最新规范建议点击查看 本节主要介绍了PHP的编码规范PSR,建议大家在开发中尽量遵循此规范,特别是团队开发的时候,我们不应该各自有着各自的编码风格,应该尽可能统一风格。正如PHP-FIG组织的初衷所说,他们建立的规范不是限制大家的编码自由,只是寻找共性,为了我们一起更好的协同工作。 推荐学习:《PHP视频教程》 以上就是手写PHP API框架(一)之PSR规范的详细内容,更多请关注gxlsystem.com其它相关文章!创作初衷
你能学到什么
<?php
declare(strict_types=1);
namespace Vendor\Package;
use Vendor\Package\{ClassA as A, ClassB, ClassC as C};
use Vendor\Package\SomeNamespace\ClassD as D;
use function Vendor\Package\{functionA, functionB, functionC};
use const Vendor\Package\{ConstantA, ConstantB, ConstantC};
class Foo extends Bar implements FooInterface
{
public function sampleFunction(int $a, int $b = null): array
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}
final public static function bar()
{
// method body
}
}
控制结构关键词后必须有一个空格。
左括号 ( 后一定不能有空格。
右括号 ) 前也一定不能有空格。
右括号 ) 与开始花括号 { 间一定有一个空格。
结构体主体一定要有一次缩进。
结束花括号 } 一定在结构体主体后单独成行。复制代码
\<命名空间>(\<子命名空间>)*\<类名>
.php
为后缀的文件同名。例子
完整类名 命名空间前缀 文件基目录 文件路径 \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