提升PHP技能:18个实用高级特性
掌握PHP基础知识只是第一步。 深入了解这18个强大的PHP特性,将显著提升您的开发效率和代码质量。
1、超越 __construct() 的魔法方法
虽然 __construct()
为大多数开发者所熟知,PHP 却提供了更多强大的魔术方法,例如:
class DataObject {private array $data = [];// 设置不可访问的属性时调用public function __set($name, $value) {$this->data[$name] = $value;}// 获取不可访问的属性时调用public function __get($name) {return $this->data[$name] ?? null;}// 对不可访问的属性使用 isset() 时调用public function __isset($name) {return isset($this->data[$name]);}// 序列化对象时调用public function __sleep() {return ['data'];}
}
2、生成器和收益
使用生成器迭代大型数据集,显著降低内存消耗
function readHugeFile($path) {$handle = fopen($path, 'r');while (!feof($handle)) {yield trim(fgets($handle));}fclose($handle);
}// 用法
foreach (readHugeFile('large.txt') as $line) {echo $line . PHP_EOL;
}
3、匿名类
可以使用匿名类创建无需正式声明的单例实例
$logger = new class {public function log($message) {echo date('Y-m-d H:i:s') . ": $message\n";}
};$logger->log('发生了一些事');
4、属性(PHP 8+)
代码的元数据注释:
#[Route("/api/users", methods: ["GET"])]
#[Authentication(required: true)]
class UserController {#[Inject]private UserService $userService;#[Cache(ttl: 3600)]public function getUsers(): array {return $this->userService->getAllUsers();}
}
5、纤程并发
PHP 8.1+中的协作式多任务处理:
$fiber = new Fiber(function(): void {$value = Fiber::suspend('suspended');echo "Value: $value\n";
});$value = $fiber->start();
echo "Fiber suspended with: $value\n";
$fiber->resume('resumed');
6、带有空合并的方法链
优雅地处理可能返回 null 的方法链调用
class User {public function getProfile() {return new Profile();}
}$user = null;
$result = $user?->getProfile()?->getName() ?? 'Anonymous';
7、动态属性访问
变量属性和方法名称:
class DataAccess {private $name = 'John';private $age = 30;public function getValue($property) {$getter = 'get' . ucfirst($property);return $this->$getter();}public function getName() {return $this->name;}
}
8、可调用函数和闭包
高级功能处理:
$multiply = Closure::bind(function($x) {return $x * $this->multiplier;},new class { public $multiplier = 2; }
);echo $multiply(5); // 输出: 10
9、特征组成
在类之间复用复杂的业务逻辑
trait Timestampable {private $createdAt;private $updatedAt;public function touch() {$this->updatedAt = new DateTime();}
}trait SoftDeletable {private $deletedAt;public function softDelete() {$this->deletedAt = new DateTime();}
}class User {use Timestampable, SoftDeletable {Timestampable::touch insteadof SoftDeletable;}
}
10、命名参数
使用PHP 8更清晰的函数调用:
function createUser(string $name,string $email,?string $role = null,bool $active = true
) {// 实现
}createUser(email: 'john@example.com',name: 'John',active: false
);
11、一等可调用函数
PHP 8.1 的简化调用语法:
class Math {public function add($a, $b) {return $a + $b;}
}$math = new Math();
$add = $math->add(...);
echo $add(5, 3); // 输出: 8
12、枚举
PHP 8.1中的类型安全枚举:
enum Status: string {case DRAFT = 'draft';case PUBLISHED = 'published';case ARCHIVED = 'archived';public function color(): string {return match($this) {Status::DRAFT => 'gray',Status::PUBLISHED => 'green',Status::ARCHIVED => 'red',};}
}
13、属性类型强制转换
自动类型转换:
class Config {private int $timeout = '60'; // 自动将字符串转换为 int private float $rate = '0.5'; // 自动将字符串转换为浮点数
}
14、引用返回值
通过函数返回修改值:
class Collection {private array $items = [];public function &getItem($key) {return $this->items[$key];}
}$collection = new Collection();
$item = &$collection->getItem('key');
$item = 'new value'; // 修改原始数组
15、后期静态绑定
静态调用的正确继承:
class Parent {public static function who() {return static::class;}
}class Child extends Parent {
}echo Child::who(); // 输出: Child
16、操作码缓存
通过字节码缓存进行性能优化:
// php.ini configuration
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.validate_timestamps=0
17、预加载
永久内存类加载(PHP 7.4+):
// preload.php
opcache_compile_file(__DIR__ . '/vendor/autoload.php');
opcache_compile_file(__DIR__ . '/app/Models/User.php');
18、反射API
运行时代码检查与修改:
class Inspector {public static function getPropertyTypes($class) {$reflection = new ReflectionClass($class);$properties = [];foreach ($reflection->getProperties() as $property) {$type = $property->getType();$properties[$property->getName()] = $type ? $type->getName() : 'mixed';}return $properties;}
}
结论
掌握这些高级PHP特性,将显著提升您的代码质量、开发效率和问题解决能力,从而构建更优雅、高效且易于维护的PHP应用程序。
相关文章:
提升PHP技能:18个实用高级特性
掌握PHP基础知识只是第一步。 深入了解这18个强大的PHP特性,将显著提升您的开发效率和代码质量。 1、超越 __construct() 的魔法方法 虽然 __construct() 为大多数开发者所熟知,PHP 却提供了更多强大的魔术方法,例如: class Da…...
QT数据库(三):QSqlQuery使用
QSqlQuery 简介 QSqlQuery 是能运行任何 SQL 语句的类,如 SELECT、INSERT、UPDATE、DELETE 等 SQL 语句。所以使用 QSqlQuery 几乎能进行任何操作,例如创建数据表、修改数据表的字段定义、进行数据统计等。如果运行的是 SELECT 语句,它查询…...
【机器学习】在向量的流光中,揽数理星河为衣,以线性代数为钥,轻启机器学习黎明的瑰丽诗章
文章目录 线性代数入门:机器学习零基础小白指南前言一、向量:数据的基本单元1.1 什么是向量?1.1.1 举个例子: 1.2 向量的表示与维度1.2.1 向量的维度1.2.2 向量的表示方法 1.3 向量的基本运算1.3.1 向量加法1.3.2 向量的数乘1.3.3…...
设计模式详解(十一):模板方法——Template Method
Template Method 设计模式 1. 概述 Template Method 是一种行为设计模式,它定义了一个算法的框架,并允许子类在不改变算法结构的前提下重新定义算法中的某些步骤。 在 Template Method 模式中: 父类(抽象类)定义了…...
使用 DeepSpeed 微调 OPT 基础语言模型
文章目录 OPT 基础语言模型Using OPT with DeepSpeedmain.py 解析1、导入库和模块2、解析命令行参数3、main 函数3.1 设备与分布式初始化3.2 模型与数据准备3.3 定义评估函数3.4 优化器与学习率调度器设置3.5 使用 deepspeed 进行模型等初始化3.6 训练循环3.7 模型保存 4、dsch…...
DPDK用户态协议栈-TCP Posix API 2
tcp posix api send发送 ssize_t nsend(int sockfd, const void *buf, size_t len, __attribute__((unused))int flags) {ssize_t length 0;void* hostinfo get_host_fromfd(sockfd);if (hostinfo NULL) {return -1;}struct ln_tcp_stream* stream (struct ln_tcp_stream…...
打造微信小程序中的视频播放交互体验:videoUI组件库实战
本文还有配套的精品资源,点击获取 简介:本项目介绍如何利用 videoUI 组件库在微信小程序中实现视频切换播放和全屏播放功能。涵盖微信小程序开发基础、 <video> 组件使用、视频切换逻辑、全屏播放实现以及 videoUI 库的应用。为开发者提供…...
Django REST framework(DRF)在处理不同请求方法时的完整流程
文章目录 一、POST 请求创建对象的流程二、GET 请求获取对象列表的流程三、GET 请求获取单个对象的流程四、PUT/PATCH 请求更新对象的流程五、自定义方法的流程自定义 GET 方法自定义 POST 方法 一、POST 请求创建对象的流程 请求到达视图层 方法调用: dispatch说明…...
【Hive】-- hive 3.1.3 伪分布式部署(单节点)
1、环境准备 1.1、版本选择 apache hive 3.1.3 apache hadoop 3.1.0 oracle jdk 1.8 mysql 8.0.15 操作系统:Mac os 10.151.2、软件下载 https://archive.apache.org/dist/hive/ https://archive.apache.org/dist/hadoop/ 1.3、解压 tar -zxvf apache-hive-4.0.0-bin.tar…...
unity 雷达
unity 雷达 首先去商店下载TouchScript插件 导入的时候勾选Enable TUIO 然后把预制体Cursors和TouchManager拖上 最后把TuioInput这个脚本挂上 脚本上的端口号尽量不改...
Visual Studio 2022 安装和管理 GitHub Copilot
🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...
Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能…...
利用notepad++删除特定关键字所在的行
1、按组合键Ctrl H,查找模式选择 ‘正则表达式’,不选 ‘.匹配新行’ 2、查找目标输入 : ^.*关键字.*\r\n (不保留空行) ^.*关键字.*$ (保留空行)3、替换为:(空) 配置界面参考下图: …...
Alan Chhabra:MongoDB AI应用程序计划(MAAP) 为客户提供价值
MongoDB全球合作伙伴执行副总裁 Alan Chhabra 每当有人向我问询MongoDB,我都会说他们很可能在不觉之间已经与MongoDB有过交集。事实上,包括70%财富百强在内的许多世界领先企业公司都在使用MongoDB。我们在MongoDB所做的一切都是为了服务客户,…...
FFmpeg 实战解复用与复用
FFmpeg FFmpeg 是一个功能强大、广泛使用的多媒体处理工具,可以处理音频、视频、字幕以及多种容器格式的操作。它支持解码、编码、复用、解复用、流式传输、过滤等功能。以下是关于 FFmpeg 的一些核心信息和操作说明: 核心组件 FFmpeg 是由以下几个主要库组成的: libavcode…...
数据结构(顺序表)JAVA方法的介绍
前言 在 Java 中,集合类(Collections)是构建高效程序的核心组件之一,而 List 接口作为集合框架中的重要一员,是一个有序、可重复的元素集合。与 Set 接口不同,List 保证了元素的顺序性,并允许存…...
电商商品详情API接口(item get)数据分析上货
电商商品详情API接口(item get)在数据分析与商品上货方面发挥着重要作用。以下是对这两个方面的详细探讨: 一、数据分析 数据源获取: 商品详情API接口提供了丰富的数据源,包括商品的标题、价格、库存、描述、图片、用…...
supervisor使用详解
0、介绍 supervisor 是一个用 Python 编写的客户端/服务器系统,它允许用户在类 UNIX 操作系统(如 Linux)上监控和控制进程。supervisor 并不是一个分布式调度框架,而是一个进程管理工具,它可以用来启动、停止和重启程…...
结合开源低代码-microi吾码 阿里云建桶,以及minio文件转移阿里云oss
前言 最近在工作中,碰到一开始一个小程序的照片和视频都放在公司的minio服务器上存储。但日积月累的,而且这个客户的访问量也大,照片和视频每天的存储空间也很大,这每天也是比不菲的费用,而且也会加慢后台的访问速度。…...
如何为IntelliJ IDEA配置JVM参数
在使用IntelliJ IDEA进行Java开发时,合理配置JVM参数对于优化项目性能和资源管理至关重要。IntelliJ IDEA提供了两种方便的方式来设置JVM参数,以确保你的应用程序能够在最佳状态下运行。本文将详细介绍这两种方法:通过工具栏编辑配置和通过服…...
关于SQL注入的面试题及经验分享
Q:简述数据库的存储引擎 A:数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不…...
ISP(Image Signal Processor)——HDR技术总结
传统多帧融合技术 拍摄一系列不同曝光时长的图像帧(LDR),然后使用融合算法进行融合成HDR图像。 融合算法可以分为两种 基于照度图估计的融合 基于照度估计需要拟合相机响应函数,详细可以参考如下论文: Recovering H…...
Python字符串及正则表达式(十):字符串常用操作、字符串编码转换
前言:在编程的世界里,字符串无处不在。它们是构建用户界面、存储数据、进行通信的基础元素。无论是财务系统的总账报表、电子游戏的比赛结果,还是火车站的列车时刻表,这些信息最终都需要以文本的形式呈现给用户。这些文本的背后&a…...
测试工程师八股文04|计算机网络 和 其他
一、计算机网络 1、http和https的区别 HTTP和HTTPS是用于在互联网上传输数据的协议。它们都是应用层协议,建立在TCP/IP协议栈之上,用于客户端(如浏览器)和服务器之间的通信。 ①http和https的主要区别在于安全性。http是一种明…...
Codeforces Global Round 27的C题
题目大意 给定一个n,n>5 ans0 ans&a1|a2&a3|a4&a5...an,数组a是一个排列 下标是奇数让ans对其进行&操作,否则进行|操作,求ans能达到的最大值. 分奇偶来讨论,在n为奇数的情况下,最后一次操作是|,在n为偶数的情况下,最后一次操作是&. n二进制最高位的计算…...
【Linux】Nginx一个域名https一个地址配置多个项目【项目实战】
👨🎓博主简介 🏅CSDN博客专家 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入!…...
第36次CCF计算机软件能力认证 梦境巡查
梦境巡查 刷新 时间限制: 1.0 秒 空间限制: 512 MiB 相关文件: 题目目录 题目背景 传说每当月光遍布西西艾弗岛,总有一道身影默默守护着居民们的美梦。 题目描述 梦境中的西西艾弗岛由 �1n1 个区域组成。梦境…...
[机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)
AdaBoost AdaBoost(Adaptive Boosting)是一种Boosting算法,它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高分类性能。 AdaBoost算法的特点是它能够自适应地调整样本的权重,使那些被错误分类的样本在后续的训练中得到…...
传统零售商商业升级的核心动机及与互联网业务融合的探索——以 AI 智能名片 S2B2C 商城小程序源码为例
摘要:本文旨在探讨传统零售商尝试商业升级的核心动机,并以 AI 智能名片 S2B2C 商城小程序源码为典型案例,分析互联网业务模式如何助力传统零售商转型。通过剖析传统零售增长模式的局限以及互联网业务在增长速度、迭代试错和用户需求洞察方面的…...
飞牛 fnos docker镜像部署OpenSpeedtest宽带网速测试教程
penSpeedTest是一个跨平台的网络测速应用,支持不同操作系统的浏览器,无需安装额外软件或插件。您可以在iPhone、iPad、Android设备、Windows和Linux系统的电脑、手机和平板上直接测试设备与NAS之间的宽带速度。 通过这个可以排查出设备与NAS之间的传输速…...
【C++】list
OK,最近浅浅学习了STL的list,有兴趣不妨垂阅! 目录 1.constructor 2.assign 3.insert 4.erase 5. reverse 6.swap 7.merge 8.unique 9.splice 10.小知识 同样的,使用list 需要包含一个头文件<list>。<list&g…...
keepalive的高可用集群
一、keepalived概述 1.keepalive的工作原理 keepalive是专门为了lvs集群开发出来的,但是适用场景不仅仅局限于lvs。而且keepalive为后台的真实服务器做了一个健康检查,当服务不可用时,会自动的移除ipvs的转发策略,服务恢复时&…...
HTTP 协议报文结构 | 返回状态码详解
注:本文为 “HTTP 历史 | 协议报文结构 | 返回状态码” 相关文章合辑。 未整理去重。 HTTP 历史 wangjunliang 最后更新: 2024/3/16 上午10:29 超文本传输协议(英语:HyperTextTransferProtocol,缩写:HTTP)是 万维网(World Wide Web)的基础协议。自 蒂姆…...
如何保证开源AI呼入机器人和AI呼出机器人的服务质量?
如何保证开源AI呼入机器人和AI呼出机器人的服务质量? 确保开源AI呼入机器人和AI呼出机器人的服务质量是企业成功部署这些智能系统的关键。高质量的服务不仅能够提高客户满意度,还能增强企业的市场竞争力。以下是实现这一目标的几个关键策略和技术措施&a…...
C++day7
#include <iostream>using namespace std; template <class T> class mylist{ public:struct Link{T val;Link* next;Link* front;};//增void insert(T val);//删void remove(T val);//改mylist& operator[](int index);//排序void Sort();//遍历void show();/…...
docker搭建Redis集群及哨兵(windows10环境,OSS Cluster)
一、基本概念 Redis:即 "Remote DIctionary Server" ,翻译为“远程字典服务器”。从字面意义上讲,它指的是一个远程的字典服务,意味着它是一个可以远程访问的服务,主要用于存储键值对(key-value pairs&…...
第8章 搬移特性
8.1 搬移函数 模块化是优秀软件设计的核心所在,好的模块化能够让我在修改程序时只需理解程序的一小部分。为了设计出高度模块化的程序,我得保证互相关联的软件要素都能集中到一块,并确保块与块之间的联系易于查找、直观易懂。同时,…...
[IT项目管理]项目时间管理(本章节3w字爆肝)
七.项目时间管理 7.1 项目进度的重要性 为什么要重视项目进度:在项目进行的过程之中会遇到变故。但是不论项目中发生了什么,时间总是在流逝,就可能会导致项目不可以在规定的时间完成。 7.2可能影响项目进度的因素 有员工离职个人的工作方…...
k8s中设置annotation的方法总结
k8s中设置annotation的方法总结 annotation是什么 在 Kubernetes 中,Annotations 是一种用于向 Kubernetes 对象附加非标识性元数据的机制。 annotation有什么用 annotation与 Labels 类似,但有一些关键区别和特定用途。 常用于存储与对象相关的配置…...
第19天:信息收集-Web应用源码获取闭源备份开发泄漏WebPack打包资源搜索ICO定位
#知识点 1、信息收集-Web应用-源码获取-已知指纹&未知指纹 2、信息收集-Web应用-源码获取-泄漏问题&发现指纹 一、参考文章: https://www.secpulse.com/archives/124398.html https://mp.weixin.qq.com/s/QgLDdaefXlZtvlSiFQShZw 二、源码泄漏原因ÿ…...
uniapp小程序的锚点定位(将页面滚动到目标位置)
小程序中,a页面跳转到b页面,跳转后滚动定位到b页面的特定位置。 1.uni.pageScrollTo传递一个scrollTop参数可以滚动到特定位置。2.可以通过 uni.createSelectorQuery()等获取定位元素的位置信息。3.uni.getSystemInfoSync()获取设备的导航栏和状态栏高度…...
py脚本部署到服务器定时启动
py脚本部署到服务器定时启动 一、准备好你的脚本二、把脚本放到服务器三、在服务器创建脚本所需要的环境1、安装 Miniconda(如果不想安装 Anaconda 或 Miniconda,可以直接使用 Python 的venv模块创建虚拟环境,但安装 Conda 会更方便管理不同版…...
相机不动,机构动作----Hands Eyes
最近在研究 手眼标定,发现大家都需付费,搞啥子,说好的开源。。。 以相机在上固定不动,机械手为 EPSON_Robot 为例,详细的一步一步实例操作指引 EPSON_Robot 的192.168.0.1 2004 Server 详细操作步骤 1. 启动程序 运…...
Jdk1.7到Jdk1.8 HashMap 发生了什么变化(底层)
从JDK 1.7到JDK 1.8,HashMap在底层实现上发生了显著的变化, 主要体现在数据结构、链表插入方式、哈希算法、扩容机制以及并发性方面。 以下是具体的变化点: 1. 数据结构的变化 JDK 1.7:HashMap的底层数据结构是数组单向链表。…...
微积分复习笔记 Calculus Volume 2 - 4.2 Direction Fields and Numerical Methods
4.2 Direction Fields and Numerical Methods - Calculus Volume 2 | OpenStax...
java后端环境配置
因为现在升学了,以前本来想毕业干java的,很多java的环境配置早就忘掉了(比如mysql maven jdk idea),想写个博客记录下来,以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…...
Unity UI Button 事件优先级调整技术方案
Unity UI Button 事件优先级调整技术方案 在 Unity 项目开发过程中,针对 UI Button 的事件执行顺序控制是一个常见需求。本文详细阐述两种将新添加事件置于第一个执行位置的方法,旨在为开发者提供全面且专业的技术参考。 一、基于反射机制的事件插入方…...
【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string
文章目录 知识回顾一、栈(Stack)和堆(Heap)1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢?值类型引用类型 2、总结 三、特殊的引用类…...
PHP排序算法:数组内有A~E,A移到C或者C移到B后排序,还按原顺序排序,循环
效果 PHP代码 public function demo($params){function moveNext($arr){$length count($arr);$lastElement $arr[$length - 1];for ($i $length - 1; $i > 0; $i--) {$arr[$i] $arr[$i - 1];}$arr[0] $lastElement;return $arr;}function moveAndReplace($array, $from…...
keepalived的高可用集群
keepalived的概念 keepalived的工作原理 基于vrrp实现的调度器高可用方案 keepalived的配置实验 先在调度服务器上安装keepalived和ipvsadm apt -y install keepalived ipvsadm 复制keepalived的配置文件到/etc/keepalived/目录下 cp /usr/share/doc/keepalived/samples/keep…...