А хіба current() та end() вже не справляються?

А хіба current() та end() вже не справляються?

На одній з персональних консультацій ми з одним з читачів обговорювали статтю про нововведення в PHP 8.5, зокрема появу функцій array_first() та array_last().

У нього виникло питання:

“А навіщо це потрібно, якщо є current() і end()?”

І раптом я подумав, що це питання може виникнути не тільки в нього, бо може здатися, що current() та end() роблять те саме.

Тому я вирішив коротко розкласти все по поличках.

Що насправді роблять current() та end()

Функція current() справді повертає перший елемент, а end() — останній елемент масиву, але тільки після того, як зрушують внутрішній вказівник масиву. Це означає, що:

$array = ['a', 'b', 'c', 'd'];

echo current($array); // 'a'

echo next($array); // 'b'
echo current($array); // 'b', а не 'a'

echo end($array);     // 'd'
echo current($array); // 'd' а не 'a'

Тобто функція current() повертає не перший елемент масиву, а той, на який вказує вказівник, а end() — останній елемент масиву, але при цьому переставляє на нього внутрішній вказівник масиву, що в свою чергу може призвести до непередбачуваних наслідків.

Концептуальний приклад: ми хочемо вивести всі елементи масиву, якщо останній елемент не "d".

$array = ['a', 'b', 'c'];

if (end($array) !== 'd') { // але вказівник вже перемістився на 'c'
    while ($item = current($array)) {
        echo $item . PHP_EOL;
        next($array);
    }
}

Але на екран виведеться тільки 'c'.

array_first() та array_last() — декларативні та передбачувані

Нові функції будуть завжди повертати перше або останнє значення без побічних ефектів.

Вони не змінюють стан вказівника і не залежать від нього:

$array = ['a', 'b', 'c'];

array_first($array); // 'a'
array_last($array);  // 'c'

// Незалежно від вказівника
next($array);
array_first($array); // все ще 'a'

PHP продовжує розвиватися в бік декларативного і безпечного коду, і ці нові функції — це не "зайве", а ще один крок до меншої кількості багів.

Якщо помітили у себе в коді current() чи end() — можливо, час подивитись на них під новим кутом.


Вперше опубліковано в Telegram-каналі «Створений щоб помирати» 25.06.2025.