![图片[1]-PHP 8.4版本的新增和改进功能-搬主题](https://cdn.banzhuti.com/2024/11/20241113144545352.png)
PHP 是一种服务器端脚本语言,它为我们最喜欢的 CMS WordPress提供支持。在 11 月 21 日 GA 版本 8.4 发布之前,PHP 的开发人员发布了新代码库的多个早期版本,包括自 8 月功能冻结以来的少数候选版本。
除了新功能、改进和弃用之外,我们预计 2024 年的这个时候 PHP 的发布周期将会进行调整,所有当前支持版本的安全版本发布结束时间都将同步到年底,而不是其 GA 生日。
此外,该支持延长了一年,这意味着您可以在 2028 年安全地使用 PHP 8.4(两年的安全和错误修复以及两年的安全修复)。
虽然您可能可以花更多时间使用 PHP 8.4,但您可能想立即了解此版本中的新功能。那么,让我们开始吧。
PHP 8.4 中的新功能和改进
与 8.4 中的一些新增功能相比,去年发布的PHP 8.3中包含的新功能似乎低调:
属性钩子
属性钩子为处理PHP 面向对象编程(OOP)中的“getter”和“setter”带来了一种全新的方法,使您能够简化类文件的结构。
作为属性钩子可以替代的内容的示例,下面的简单类包含属性$size和$flavor。它们具有private可见性,以防止在结果对象之外直接访问它们。这就是为什么公共 getter 和 setter 方法调解对属性的访问:
class Coffee
{
private string $size;
private string $flavor;
public function __construct(string $size, string $flavor) {
$this->size = $size;
$this->flavor = $flavor;
}
// "Setting" coffee size and flavor
public function setSize(string $size): void {
$this->size = $size;
}
public function setFlavor(string $flavor): void {
$this->flavor = $flavor;
}
// "Getting" coffee size and flavor
public function getSize(): string {
return $this->size;
}
public function getFlavor(): string {
return $this->flavor;
}
} // End of class
// Make some coffee
$coffee = new Coffee('Small', 'Pumpkin Spice');
print $coffee->getSize() . ' ' . $coffee->getFlavor(); // Prints "Small Pumpkin Spice"
// Change order
$coffee->setSize('Grande');
$coffee->setFlavor('Mocha');
print $coffee->getSize() . ' ' . $coffee->getFlavor(); // Prints "Grande Mocha"或者,也许您的类有很多属性,您没有编写许多 getter 和 setter 方法,而是使用 PHP_get和魔术方法。您甚至可以像下面这段摘录一样,_set用一个有点混乱的语句来理清事情。switch
// __set magic method example
public function __set(string $key, $value): void
switch ($key) {
case 'size':
$this->size = $value;
break;
case 'flavor':
$this->flavor = $value;
break;
default:
throw new InvalidArgumentException('Invalid input');
}
}
// Later, we can change the coffee order like this:
$coffee->size = 'Grande';
$coffee->flavor = 'Mocha';无论你选择哪种方法,类中的属性越多,用于操作这些属性的代码距离类文件顶部附近的定义就越远。此外,_get和_set魔术方法的一些实现可能会意外地提供对对象中你不打算公开的私有或受保护属性的访问。
新的属性钩子将 getter 和 setter 功能与属性本身捆绑在一起。在下面的属性钩子示例中,您会注意到Coffee 类的$size和属性现在是公共的。但我们还在钩子中添加了一些基本验证,以将其与直接赋值区分开来。$flavorset
// Property definitions at the top of our Coffee class
class Coffee
{
public string $flavor {
set(string $value) {
if (strlen($value) > 16) throw new InvalidArgumentException('Input is too long');
$this->flavor = $value;
}
}
public string $size {
set(string $value) {
if (! in_array($value, array(‘Small’, ‘Grande’))) throw new InvalidArgumentException('Not a valid size');
$this->size = $value;
}
}
// Rest of the Coffee class
}
// Define a coffee
$coffee = new Coffee();
$coffee->size = 'Grande';
$coffee->flavor = 'Pumpkin spice';同样,正如您在下面看到的,get钩子可以将功能打包到看似对对象属性的普通引用中。
// Simplified Coffee class
class Coffee
{
public string $flavor {
get {
return $this->flavor . ' Spice';
}
}
}
// Create a flavor
$coffee = new Coffee();
$coffee->flavor = 'Pumpkin'; // Stores the value "Pumpkin"
print $coffee->flavor; // Prints "Pumpkin Spice"与 PHP 魔术方法不同,属性钩子可以在接口和抽象类中使用。接口示例:
interface Coffee
{
public string $size { get; set; }
public string $flavor { get; set; }
}不对称可见性
我们之前研究过的公开可见的 getter 和 setter 方法代表了访问类中的私有和受保护属性的传统方法。
PHP 8.4 的一个巧妙功能是,属性可以根据访问上下文具有不同的可见性级别。因此,属性在读取时可能是公共的,但在设置时可能是私有的或受保护的。
看看这个:
class Coffee
{
public private(set) string $flavor = 'Pumpkin Spice';
}
$coffee = new Coffee();
print $coffee->flavor; // Prints "Pumpkin Spice"
$coffee->flavor = 'Mocha'; // Error (visibility)上面,类的$flavor属性除了在设置上下文中外都是公共的。这已经相当简单了,但不对称可见性甚至还有一点捷径:
class Coffee
{
// public is assumed when the context is not setting
private(set) string $flavor = 'Pumpkin Spice';
}您可以结合使用属性挂钩和不对称可见性,从而在处理各种可见性的对象属性时获得极大的灵活性。
new不使用括号的链接
说到简写,调用new和链接方法需要将其调用放在括号中,如下所示:
$coffee = (new Coffee())->getFlavor()->getSize();PHP 8.4 允许这样做:
$coffee = new Coffee()->getFlavor()->getSize();这似乎只是一个小小的改变,但只要去掉两个括号就可以让它更易于阅读和调试。
查找数组项的新功能
从“您是说我们不能这样做吗?”部分,PHP 8.4 引入了函数array_find(),它可以在数组元素中搜索与回调函数中表达的条件匹配的成员。该函数返回与回调的测试匹配的第一个元素的值。
新版本还包含另外三个相关功能:
array_find_key():类似array_find(),但是返回值是匹配元素的键而不是元素本身的值。array_all():true如果测试的数组中的每个元素都与回调的测试匹配,则返回。array_any():true如果数组中至少有一个元素与回调的测试匹配,则返回。
请注意,最后两个函数返回布尔指示符而不是数组键或内容。
以下是一些简单示例:
$array = [
'a' => 'Mocha',
'b' => 'Caramel',
'c' => 'Maple',
'd' => 'Pumpkin'
];
// Find the first flavor name that is 5 characters long
var_dump(array_find($array, function (string $value) {
return strlen($value) == 5;
})); // Returns “Mocha,” even though “Maple” is the same length
// Find the array key for the first flavor with a name longer than 5 characters.
var_dump(array_find_key($array, function (string $value) {
return strlen($value) > 5;
})); // Returns “b”
// Check to see if any flavor name is less than 5 characters long
var_dump(array_any($array, function (string $value) {
return strlen($value) < 5;
})); // Returns false
// Check to see if all flavor names are shorter than 8 characters
var_dump(array_all($array, function (string $value) {
return strlen($value) < 8;
})); // Returns trueHTML5 解析
HTM5 是现代网页结构的事实标准,但 PHP 的文档对象模型 (DOM) 解析技术已停滞在 HTML 4.01。
PHP 8.4并没有升级DOMDocument与旧 HTML 标准兼容的现有类,而是附带了一个DomHTMLDocument支持 HTM5 的新类。
您可以像这样导入 HTML5 页面的内容:
$document = DomHTMLDocument::createFromString($html)除了createFromString($html)上述构造函数之外,该类还createFromFile($path)支持createEmpty()
新的解析器可以识别我们大多数人现在都熟悉的语义 HTML5 标签,例如main、article和。section
多字节修剪函数
PHP 8.4 中另一个似乎酝酿已久的新增功能是 trim 函数中的多字节支持:
mb_trim()mb_ltrim()mb_rtrim()
与长期存在的 PHPtrim()函数一样,mb_trim它会从可能包含多字节字符的字符串的两端删除空格和一些特殊字符(如换行符)。其他函数会修剪字符串的左端或右端。
PHP 8.4 中的弃用内容
PHP 的每个版本都会带来一长串特性和功能(有些相当晦涩),这些特性和功能被标记为最终将从平台中删除。PHP 8.4 中一个备受瞩目的弃用功能是无 Cookie 会话跟踪。
弃用 GET/POST 会话
虽然Cookie通常是跟踪用户会话的首选方法,但 PHP 已支持在 GET/POST 参数中固定会话 ID 数据。要通过 URL 中的参数启用会话跟踪,请禁用 PHP 设置,并启用session.use_only_cookies该设置。session.use_trans_sid
对于 PHP 8.4,这两种设置状态都会触发弃用警告,该警告可能会出现在您的网站日志中。PHP 9 发布后,这些设置将不再可用。
PHP 8.4 中的其他弃用(和删除)
以下是 PHP 8.4 团队计划弃用的功能列表。(其中一些包含有关这些功能的更多信息的链接。)
- 正式弃用软弃用的
DOMDocument和DOMEntity属性。 - 已移除
DOMImplementation::getFeature($feature, $version)。 - 弃用
DOM_PHP_ERR常数。 - 弃用中的“S”标签
unserialize()。 - 弃用
session.sid_length和session.sid_bits_per_character。 - 弃用
SplFixedArray::__wakeup()。 - 弃用带有字符串方法名称的
xml_set_object()和。xml_set_*_handler() - 弃用将 null 和 false 传递给
dba_key_split()。 - 不赞成将不正确的数据类型传递给 ext/hash 函数。
- 弃用常量
SUNFUNCS_RET_STRING、SUNFUNCS_RET_DOUBLE、SUNFUNCS_RET_TIMESTAMP。 - 弃用专有的 CSV 转义机制。
- 弃用
E_STRICT常数。 - 弃用
strtok()。 - 不赞成从用户输出处理程序返回非字符串值。
- 弃用在用户输出处理程序中生成输出。
- 弃用
file_put_contents()作为$data数组。 - 弃用
mysqli_ping()和mysqli::ping() - 弃用
mysqli_refresh()。 - 弃用
mysqli_kill()。 - 弃用第二个参数
mysqli_store_result()。 - 弃用
lcg_value()。 - 弃用
uniqid()。 - 弃用
md5()、sha1()、md5_file()和sha1_file()。 - 弃用传递
E_USER_ERROR给trigger_error()。 - 不推荐使用单下划线(“_”)作为类名。
- 弃用
SOAP_FUNCTIONS_ALL常量并将其传递给SoapServer::addFunction()。
概括
PHP 8.4 带来了一些有趣的变化。
您最喜欢 PHP 8.4 的哪些功能?
























暂无评论内容