命名空间 namespace
其作用是按照一种虚拟的层次结构组织PHP代码,现代PHP组件和框架都放在各自全局唯一的厂商命名空间中,以避免常见类名冲突。命名空间还是PSR-4 自动加载的基础
<?php
// 声明命名空间
namespace Symfony\Component\HttpFoundation
// 导入
use Symfony\Component\HttpFoundation\Response;
$response = new Response('Oops',400);
$respons->send();
接口 interface
使用接口编写的代码更灵活,能委托别人实现细节。
<?php
// 定义接口方法
interface Doumentable{
public function getId();
public function getContent();
}
<?php
// 接口方法实现1
class HtmlDocument implements Documentable
{
protected $url;
public function __construct($url)
{
$this->url = $url;
}
public function getId()
{
return $this->url;
}
public function getContent()
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$html = curl_exec($ch);
curl_close($ch);
return $html;
}
}
<?php
// 接口方法实现2
class StreamDocument implements Documentable
{
protected $resource;
protected $buffer;
public function __construct($resource, $buffer = 4096)
{
$this->resource = $resource;
$this->buffer = $buffer;
}
public function getId()
{
return 'resource-' . (int)$this->resource;
}
public function getContent()
{
$steamContent = '';
rewind($this->resource);
while (feof($this->resource) == false) {
$steamContent .= fread($this->resource, $this->buffer);
}
return $steamContent;
}
}
性状 trait
性状是类的部分实现(即常量,属性和方法),可以混入一个或多个现有PHP类中。性状有两个作用:表明类可以做什么(像是接口);提供模块化实现(像是类)。
性状能把模块化的实现方式注入多个物管的类中,而且还能促进代码重用。
<?php
// 创建形状
trait MyTrait
{
//这里是性状
}
<?php
class MyClass
{
use MyTrait;
// 这里是类的实现
// 注意:命名空间use 在定义体外,性状在定义体内
}
生成器 generators
与标准的PHP迭代器不同,PHP生成器不要求实现Iterator接口,从而减轻了类的负担。生成器会根据需求计算并产生要迭代的值,不需要占用宝贵的内存,有助于优化性能。
注意:生成器只产出值,没有返回值。无法后退或者快进。而且还是一次性的,无法多次迭代同一个迭代器。不过,如果需要,可以重建或者克隆生成器。
<?php
// 生成器生成一个范围数值
// 一次只会为一个整数分配内存
function makeRange($length)
{
for ($i = 0; $i < $length; $i++) {
yield $i;
}
}
foreach (makeRange(1000000) as $i) {
echo $i, PHP_EOL;
}
<?php
// 使用生成器处理csv文件
// 每次只会为csv文件中的一行分配内存,不会把整个文件读入内存中,适合读取超大的文件
function getRow($file)
{
$handle = fopen($file, 'rb');
if ($handle == false) {
throw new \Exception();
}
while (feof($handle) === false) {
yield fgetcsv($handle);
}
fclose($handle);
}
foreach (getRow('data.csv') as $row) {
print_r($row);
}
闭包 closure
闭包是指创建时封装周围状态的函数。匿名还是是指没有名称的函数。
理论上闭包和匿名函数是不同的概念,但是PHP将其视作相同的概念。
<?php
// 创建简单的闭包
$closure = function ($name) {
return sprintf('hello %s', $name);
};
echo $closure("John");
// 输出 --> "hello John"
<?php
// 使用use附加状态
function enclosePerson($name)
{
return function ($doCommond) use ($name) {
return sprintf('%s,%s', $name, $doCommond);
};
}
// 把字符串 clay 封装到闭包中
$caly = enclosePerson('Clay');
// 传入参数,调用闭包
echo $caly('get me sweet tea');
字节码缓存 Zend OPcache
PHP 是解释型语言,PHP解析器执行PHP脚本时会解析PHP脚本代码,把PHP代码编译成一系列Zend操作码,然后执行字节码。每次HTTP请求都必须不断解析,编译和执行PHP脚本,会消耗很多资源。字节码缓存能存储先编译号的PHP字节码,请求PHPj脚本时PHP解析器会冲内存中读取预先编译好的字节码,然后执行。只有能节省时间,极大地提高性能。