ArrayObject在PHP 7.4中不能与end()一起使用



在迁移到PHP 7.4时,我必须处理一些数组函数的不同行为,如与ArrayObject有关的reset()current()end()。以下示例产生不同的输出:

<?php
$array = new ArrayObject(["a", "b"]);
$item = end($array);
var_dump($item);

$array = ["a", "b"];
$item = end($array);
var_dump($item);

使用php 7.4,输出为:

bool(false)
string(1) "b"

在7.4之前的PHP版本上,输出如下:

string(1) "b"
string(1) "b"

end($array->getArrayCopy())会产生通知,但如果与变量一起使用,则可能是一种变通方法。

有没有办法用ArrayObjectArrayIterator来模仿end()的行为?ArrayObject可能非常大,迭代到最后可能不是最好的解决方案。

从PHP 7.4开始,数组方法不在内部数组上操作,而是在ArrayObject本身上操作。我总结了两种解决方案。

1.获取对象的内部数组。

$array = new ArrayObject(["a", "b"]);
$item = end($array->getArrayCopy());

2.创建ArrayObject的Facade并向升级后的类添加自定义方法end((。

您可以使arrayobject成为一个数组来获取键,然后使用键上的end来获取最后一个键。

$array = new ArrayObject(["a", "b"]);
$keys = array_keys((array)$array);
$end_key = end($keys);
var_dump($array[$end_key]);

这不是一个很好的解决方案,但它是有效的
我建议你把它作为一个函数,这样你就可以在需要的时候调用它。

https://3v4l.org/HTGYn

作为一个函数:

function end_object($array){
$keys = array_keys((array)$array);
$end_key = end($keys);
return $array[$end_key];
}

$array = new ArrayObject(["a", "b"]);
$item = end_object($array);
var_dump($item);

如果不强制转换或使用迭代器,一个稍微快一点的方法是首先不使用构造函数,而是使用append方法,该方法将自己创建一个数组,稍后可以在该数组上使用end

$array = new ArrayObject();
$array->append(["a", "b"]);
$item =  end($array[count($array) - 1]);
var_dump($item);

count($array) - 1如果以后追加另一个数组,我们会确保$item始终是最后追加的数组中的最后一个元素。

提出了这种方法。

应该比以上任何一项都表现得更好。

  • 不使用内存和CPU强制转换到另一个变量
  • 只有一个内部迭代器
  • 只有一个新变量,它是对该项的引用
class MyClass extends ArrayObject {
public function last() {
foreach ($this as $entity) {}
return $entity ?? null;
}
}
$array = new MyClass(["a", "b", "c"]);
$item = $array->last();
var_dump($item);

最新更新