PHP 新特性

命名空间 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解析器会冲内存中读取预先编译好的字节码,然后执行。只有能节省时间,极大地提高性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容