PHP Language Guide

PHP 语言指引

语法特性

命名空间

无命名空间的代码都属于全局命名空间。

<?php
# 声明
namespace online\moha; # 声明命名空间需要在 <?php 后第一行开始。

# 导入命名空间下的类,避免重复输入全名
use Symfony\Component\HttpFoundation\Response;

# 导入并创建别名
use Symfony\Component\HttpFoundation\Response as Res;

# 多重导入
use Symfony\Component\HttpFoundation\Request,
    Symfony\Component\HttpFoundation\Cookie;

# 导入函数 PHP 5.6+
use func online\moha\common\moha_start_with;

# 导入常量 PHP 5.6+
use constant online\moha\common\SECONDS_IN_YEAR;
<?php
# 一个 PHP 文件,多个命名空间
namespace online\moha\wx {

}

namespace online\moha\qr {

}
<?php
namespace online\moha;

# 没有指明命名空间的代码在全局命名空间中。
# 在命名空间下引用全局命名空间下的代码,需要用 \ 限定,否则非限定类 Exception 将被解释为 online\moha\Exception。
throw new \Exception();

接口

使用接口抽象处理流程,使代码依赖抽象定义,而非具体对象,方便扩展。

性状

PHP 5.4 开始支持,用于将共通代码注入多个无关的类以实现代码复用。

<?php

# 定义性状
trait TRAIT_NAME {
  public function FUNCTION_NAME() {

  }
}

# 使用性状,PHP 运行时会复制性状代码到类中。
class CLASS_NAME {
  use TRAIT_NAME;
}

$obj = new CLASS_NAME();
$obj->FUNCTION_NAME();

生成器

PHP 5.5 开始支持。返回一系列值/内容,并配合循环使用的函数。返回内容依次通过关键字 yield 向外传递给调用的循环,省去中间变量的内存开销。

<?php
function getRows($file) {
  $handle = fopen($file, 'rb');
  if ($handle === false) { throw new Exception(); }
  
  while (feof($handle) === false) {
    // 文件内容不会全部加载到内存再返回。
    // yield 会暂停后续处理,直至外部循环执行 1 次。
    yield fgetcsv($handle);
  }

  fclose($handle);
}

foreach (getRows('data.csv') as $row) {
  print_r($row);
}

闭包(匿名函数)

PHP 5.3 开始支持。用关键字 use 传入调用环境的变量,以对象对待,常做为回调函数使用。

array_map(function($value) use ($env){
  return $value + $env;
}, [2,3,4]);

PSR

规范 简介
PSR-1 基本代码风格
PSR-2 严格代码风格
PSR-3 日志记录器接口
PSR-4 自动加载

PSR-1

类名遵循 CamelCase,方法名遵循 camelCase。

PSR-2

缩进用 4 个空格;关键字坚持小写(true, false, null)。

PSR-3

最常见的日志框架 monolog

PSR-4

使用文件系统目录结构和 PHP 命名空间自动加载相应的 PHP 类、接口、性状。常用 Composer 生成的 PSR-4 自动加载器。

最佳实践

Author: njun
njun's picture
Updated: 2020/01/21