在迁移到 PHP 7.4 时,我必须处理一些数组函数的不同行为,比如reset(),current()或end()关于 ArrayObject。以下示例产生不同的输出:
<?php
$array = new \ArrayObject(["a", "b"]);
$item = end($array);
var_dump($item);
$array = ["a", "b"];
$item = end($array);
var_dump($item);
Run Code Online (Sandbox Code Playgroud)
使用php 7.4,输出为:
bool(false)
string(1) "b"
Run Code Online (Sandbox Code Playgroud)
在 7.4 之前的 PHP 版本上,输出如下:
string(1) "b"
string(1) "b"
Run Code Online (Sandbox Code Playgroud)
Aend($array->getArrayCopy())产生一个通知,但如果与变量一起使用可能是一种解决方法。
有没有办法模拟end()with an ArrayObjector的行为ArrayIterator?ArrayObject 可能非常大,迭代到最后可能不是最好的解决方案。
从PHP 7.4开始,数组方法不对内部数组进行操作,而是对其ArrayObject本身进行操作。我为此总结了两种解决方案。
1.获取对象内部数组。
$array = new \ArrayObject(["a", "b"]);
$item = end($array->getArrayCopy());
Run Code Online (Sandbox Code Playgroud)
2.创建 FacadeArrayObject并将自定义方法 end() 添加到升级的类中。