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解释器会从内存中读取预先编译好的字节码,然后立即执行。这样能节省时间,极大的提升应用的性能。

相关推荐
西部森林牧歌2 小时前
Arbess零基础学习 - 使用Arbess+GitLab实现PHP项目构建/主机部署
ci/cd·gitlab·php·tiklab devops
Q_Q5110082856 小时前
python+django/flask的校园活动中心场地预约系统
spring boot·python·django·flask·node.js·php
蒲公英源码7 小时前
基于PHP+Vue+小程序快递比价寄件系统
vue.js·小程序·php
Q_Q19632884759 小时前
python+django/flask基于机器学习的就业岗位推荐系统
spring boot·python·django·flask·node.js·php
韩立学长9 小时前
【开题答辩实录分享】以《奇妙英语角小程序的设计与实现》为例进行答辩实录分享
小程序·php
Tigshop开源商城系统12 小时前
Tigshop 开源商城系统 php v5.1.9.1版本正式发布
java·大数据·开源·php·开源软件
拾忆,想起14 小时前
超时重传 vs 快速重传:TCP双保险如何拯救网络丢包?
java·开发语言·网络·数据库·网络协议·tcp/ip·php
BingoGo14 小时前
15 个 Eloquent 高级技巧,瞬间提升你的 Laravel 应用性能
后端·php
michaelzhouh14 小时前
php项目ueditor上传pdf文件,防止XSS攻击
pdf·php·xss·ueditor
合作小小程序员小小店15 小时前
web网页开发,在线%商城,电商,商品购买%系统demo,基于vscode,apache,html,css,jquery,php,mysql数据库
开发语言·前端·数据库·mysql·html·php·电商