PHP特性知识点扫盲 - 上篇

概述

之前在分析thinkphp源码的时候,对依赖注入等等php高级的特性一直想做一个梳理和总结,一直没有时间,好不容易抽一点时间对技术的盲点做一个扫盲和总结。

特性

1.命名空间

命名空间是在PHP5.3中引入,是一个很重要的工具,作用是按照一种虚拟的层次结构组织PHP代码,这种层次结构类似文件目录结构。

从技术层面上看,命名空间只是PHP语言中的一种记号,PHP解释器会将其作为前缀添加到类、接口、函数和常量的名称面前。

ini 复制代码
# 声明命名空间和使用
use Symfony\Component\HttpFoundation\Response;

$response = new Response('Oops', 400);
$response->send();

#设置命名空间别名

use Symfony\Component\HttpFoundation\Response as Res;

$response = new Res('Oops', 400);
$response->send();

2.性状Trait

性状Trait是为了弥补PHP中单继承的缺陷,能把模块化的实现方式注入多个无关的类中,而且性状还能促进代码的重用。

trait 和 class 的处理方式一样 ,可以使用 public protected 关键字去定义,在解决实际问题中一个文件定义一个Trait文件,可以同时引入多个Trait,Trait方法名不能重名。

scala 复制代码
# trait的定义
trait Trait_CustomRole
{
    function CustomAuthByWhere()
    {
        //具体逻辑
    }
}

# trait的使用
class Audit_year_companys extends MY_Controller
{
    use Trait_TalentRole,Trait_AuditRole,Trait_CustomRole;
}

3.生成器 yield

生成器的优雅体现在,每次产出一个值之后,生成器的内部状态回一直在停顿和恢复之间切换,直到抵达函数定义体的末尾或遇到的return。

php 复制代码
function myGenerator() {
    yield 'value1';
    yield 'value2';
    yield 'value3';
}

foreach (myGenerator() as $value) {
    echo $value . PHP_EOL;
}

生成器没为PHP添加新功能,不用生成器也能做生成器的事儿。不过,生成器大大简化了某些任务,而且使用的内存更少。

php 复制代码
function getRows($file) {
    $handle = fopen($file, 'rb');
    if (!$handle) {
        throw new Exception();
    }
    while (!feof($handle)) {
        yield fgetcsv($handle);
    }
    fclose($handle);
}

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

4.闭包

闭包和匿名函数在PHP5.3.0中引入,闭包是指在创建时封装周围状态的函数,即便闭包所在的环境不存在了,闭包中的状态依然存在。

理论上讲,闭包和匿名函数是不同的概念。不过PHP将其视作相同的概念。

php 复制代码
$closure = function ($name) {
    return sprintf('Hello %s', $name);
};

echo $closure("stark");
// Outputs --> "Hello stark"

php很多数组函数也有闭包的特性,这里有个地方需要注意,闭包中附加状态使用参数使用use添加其他参数传递。

ini 复制代码
$numbersPlusOne = array_map(function ($number) {
    return $number + 1;
}, [1,2,3]);
print_r($numbersPlusOne);
// Outputs --> [2,3,4]

public function test(){
    $name = 'stark';
    $numbersPlusOne = array_map(function ($number) use ($name) {
        return $name.'-'.$number;
    }, [1,2,3]);
    var_dump($numbersPlusOne);
}

5.Zend OPcache

从PHP5.5.0开始,PHP内置了字节码缓存功能,名为Zend OPcache。

PHP是解释型语言,PHP解释器执行PHP脚本时会解析PHP脚本代码,把PHP代码编译成一系列Zend操作码,然后执行字节。每次请求PHP文件都是这样,会消耗很多资源,如果每次http请求php都必须不断解析、变异和执行PHP脚本,消耗的资源更多。

Zend OPcache储存预先编译好的字节码,php解释器会从内存中读取预先编译好的字节码,然后立即执行。这样能节省时间,极大的提升应用的性能。

相关推荐
两个人的幸福1 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo3 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack3 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982074 天前
PHP 扩展——从入门到理解
php
鹏仔先生5 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下5 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip5 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒5 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2505 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis5 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel