PHP 8.4: OpenSSL: OpenSSL 版本最低要求提升到 1.1.1
PHP OpenSSL 扩展为 PHP 提供了加密、身份验证、密钥交换、密码哈希和通用哈希功能。OpenSSL 扩展使用 OpenSSL 库来提供此功能。在 PHP 8.4 及更高版本上,构建 OpenSSL 扩展的最低要求从 1.0.1 增加到 1.1.1。该扩展也继续与 OpenSSL 兼容。请注意,OpenSSL 1.1.1(2018 年 9 月发布)...
属性钩子在 PHP 8.4 中越来越接近现实
属性钩子(Property Hooks)的 RFC 通过了一个重要的里程碑,获得了压倒性的 34 张赞成票和 1 张反对票。这远远高于通过所需的 ⅔ 多数票。PHP 中的属性钩子是什么?以下是 RFC 的提案摘要:开发人员经常使用方法来包装和保护对对象属性的访问。对于这种逻辑,有几种非常常见的模式,在实践中,重复实现这些模式可能很繁琐。或者,开发人员可以使用...
如何修复 Windows 上 PHP Curl HTTPS 证书授权问题
成功的 HTTPS 请求涉及 HTTP 客户端根据已知和受信任的根证书列表验证服务器提供的 TLS证书。PHP Curl 扩展也一样;Curl 扩展使用 libcurl 来发出 HTTPS 请求,而 libcurl 又使用 TLS 库(如 OpenSSL)来验证请求。Curl 扩展需要一个包含所有受信任根证书的有效文件来完成 HTTPS 验证,PHP在 php...
PHP 8.4: 隐式 nullable 参数声明弃用
PHP 8.4 中的重要弃用这是 PHP 8.4 中重要的弃用,由于 PHP 8.4 中的这一更新,旧版 PHP 应用可能会出现弃用通知。PHP 支持为函数参数、返回值、类属性、类常量和枚举声明类型。PHP 是一种动态类型语言,有着几十年的历史,多年来得到了一些改进和特性。随着标量类型(PHP 7.0)、 nullable 的类型(7.1)、类型化属性(7....
在 PHP 中使用 Google Gemini AI
人工智能时代风靡一时。许多大玩家(OpenAI、Meta、微软)已经推出了自己的人工智能模型,可以生成图像、文本甚至代码。因此,谷歌最近也加入了这股潮流,推出了自己的人工智能模型Gemini,这是很自然的。 现在,作为一名PHP开发人员,我很好奇是否可以在PHP中使用这个模型。这就是我发现这个相对较新的PHP包erdemkose/generativ...
Laragon:一款优秀的本地集成开发环境,PHP/Laravel 开发利器
什么是 Laragon?Laragon 是一个可移植、独立、快速、强大的通用开发环境,适用于 PHP、Node.js、Python、Java、Go 和 Ruby。它快速、轻便、易于使用且易于扩展。Laragon 非常适合构建和管理现代 web 应用程序。它专注于性能——围绕稳定性、简单性、灵活性和自由度进行设计。Laragon 非常轻,将尽可能保持苗条。核心...
PHP 8.4: 新增 http_(get|clear)_last_response_headers 函数
PHP 提供了一个 HTTP 包装器,可以使用标准文件系统函数访问远程 HTTP 内容。例如,file_get_contents() 函数可以获取远程 HTTP 资源以及文件系统上的常规文件。在成功建立远程连接后,HTTP 包装器填充一个名为 $http_response_header 的本地变量。此变量是在局部作用域中填充的,它不是超全局变量。这是一个历史...
PHP 8.4: 新增 mb_ucfirst 和 mb_lcfirst 函数
PHP 提供 ucfirst 和 lcfirst 函数来更改给定字符串中第一个字符的大小写。mbstring 扩展为 PHP 的大多数标准字符串函数提供了多字节安全函数。然而,在 PHP8.4 之前,mbstring 扩展没有为 ucfirst 和 lcfirst 函数提供多字节安全的对应函数。在 PHP 8.4 中,mbstring 扩展添加了 mb_uc...
PHP 随机数函数的随机性测试
随机数生成是一个生成无法合理预测的数字的过程。数字序列不应该是可预测的,它在依赖随机数序列的不可预测性的应用程序中发挥着重要作用。“真”随机数生成过程可以包括任何东西,从简单的掷硬币、掷骰子到宇宙辐射测量、大气压、熔岩灯,以及其他取决于几个自然发生的物理方面的物理手段,这使得在计算机上进行预测变得相当困难。大多数现代计算机操作系统试图提供一个接近的“真实”随...
"Typed property must not be accessed before initialization" - 引入类型提示遇到的错误
在 PHP 中,当属性的定义使用了类型提示,而在显式赋值前访问该属性时,会碰到 "Typed property must not be accessed before initialization" 错误。通过为该属性提供默认值,或者在类的构造函数中初始化该属性,可以解决这一问题。