Search code examples
phpphp-7.4

ArrayObject does not work with end() in PHP 7.4


On migrating to PHP 7.4 I have to deal with a different behavior of some array functions like reset(), current() or end() concerning ArrayObject. The following example produces different outputs:

<?php

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


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

With php 7.4 the output is:

bool(false)
string(1) "b"

On PHP versions before 7.4 the output is the following:

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

A end($array->getArrayCopy()) produces a notice, but might be a workaround if used with a variable.

Is there a way to emulate the behavior of end() with an ArrayObject or ArrayIterator? The ArrayObject could be very big, an iteration to the end might not be the best solution.


Solution

  • From PHP 7.4 array methods don't operate on internal array, but on ArrayObject itself. I summarized two solutions for that.

    1. Getting internal array of object.

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

    2. Creating Facade of ArrayObject and adding custom method end() to upgraded class.