← А хіба current() та end() вже не справляються?
docs: English JsonRpcBundle docs, REST and MCP Bundle sections, package cards
uk/articles/from-tg/php/array-first-last.md
новий файл +69
−0
А хіба 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.