Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PHP最佳实践系列之标准 #4

Open
xx19941215 opened this issue Jul 20, 2017 · 0 comments
Open

PHP最佳实践系列之标准 #4

xx19941215 opened this issue Jul 20, 2017 · 0 comments

Comments

@xx19941215
Copy link
Owner

PHP-FIG

1).即PHP Framework Interop Group。这个组织发布推荐的规范,而不是强制规范。
2).PHP-FIG的使命是实现框架的互操作性。框架的互操作性指的是通过自动加载机制、接口和标准的风格,让框架互相合作。
3).框架之间通过接口、自动加载和标准的编码风格进行合作。

PSR

1).即PHP推荐标准。这是上面的组织制定的推荐规范。例如下面的规范:

  • PSR-1:基本的代码风格
    • 必须把PHP代码放在<?php ?><??>标签中。
    • 编码字符集必须是UTF-8
    • 一个PHP文件可以定义类或者处理数据,但是不能同时做这两件事
    • 遵循自动加载
    • 类命名遵循驼峰式命名
    • 常量大写
    • 方法名称使用第一个字母小写的驼峰式命名
  • PSR-2:严格的代码风格
    • 贯彻执行PSR-1
    • 使用四个空格缩进
    • 使用UNIX风格换行符
    • 不能使用关闭标签
    • 每一行不能超过120个字符
    • PHP关键字一律小写
    • 命名空间之后必须跟一个空行
    • 类的定义体起始括号应该在类命后新起一行,类的结束括号也必须新起一行
    • 方法名的括号换行方式和类一直,参数除了第一个参数前面要有空格。
    • 必须声明属性和方法的可见性
    • 控制结构关键字后面的起始括号应该和控制结构的关键字写在同一行,结束括号另起一行。例子如下
<?php
$gorilla = new \Animals\Gorilla;
$libs = new \Animals\StrawNeckedIbis;
if ($gorilla->isAwake() === true) {
         do {
             $gorilla->beatChest();
         } while ($libs->isAsleep() === true);
         $libs->flyAway();
}
- 可以使用php code sniffer检查代码格式 
  • PSR-3:日志记录接口
    • 该规范不是一系列方针,而是一个接口,规定了PHP日志记录器组件可以实现的方法。
  • PSR-4:自动加载
    • 这个规范描述了一个标准的自动加载策略。自动加载策略是指在运行时按需查找PHP类、接口或者形状,并将其载入PHP解析器,支持PSR-4自动加载器标准的PHP组件和框架使用同一个自动加载器就能找到相关代码,然后将其载入PHP解释器。
    • 该规范的精髓是把命名空间的前缀和系统中的目录对应起来。
    • 自己实现psr-4自动加载器
<?php
spl_autoload_register(function ($class) {
    //这个项目的命名空间前缀
    $prefix = 'Foo\\Bar\\';
    //这个项目命名空间前缀对应的基目录
    $base_dir = __DIR__ . '/src/';
    //参数传入的类使用这个命名空间前缀吗?
    $len = strlen($prefix);
    if (strncmp($prefix, $class, $len) != 0) {
        //不使用,交给下一个自动加载器处理
        return;
    }
    //去掉前缀的类名
    $relative_class = substr($class, $len);
    //把命名空间前换成基目录
    //去掉前缀中的类名,把命名空间分隔符换成目录分隔符
    //然后在后面加上.php
    $file = $base_dir . str_replace('\\' , '/', $relative_class) . '.php';

    if (file_exists($file)) {
        require $file;
    }
});

这样的话当我们使用 \Foo\Bar\Baz\Qux这个类的时候,使用SPL注册了上面这个函数之后,PHP就会尝试从/path/to/project/src/Baz/Qux.php 加载这个类。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant