PHP 8.4. Что выведет код?
<?php
$values = [1, 2, 3];
foreach ($values as &$value) {
}
foreach ($values as $value) {
}
echo implode(',', $values);
👾 — 1,2,3
👍 — 1,2,2
🥰 — 3,3,3
⚡️ — Ошибка выполнения
После первого цикла $value остаётся ссылкой на последний элемент массива. Второй цикл присваивает ей очередные значения и тем самым меняет этот элемент. Чтобы убрать связь, после цикла по ссылке нужно вызвать unset($value).
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: foreach - Manual
👍5
PHP 8.4. Что выведет код?
<?php
$values = [0, 1, 2];
$filtered = array_filter(
$values,
fn($value) => $value > 0
);
echo json_encode($filtered), "\n";
echo json_encode(array_values($filtered));
👾 — [1,2], затем [1,2]
👍 — {"0":1,"1":2}, затем [1,2]
🥰 — {"1":1,"2":2}, затем [1,2]
⚡️ — {"1":1,"2":2}, затем тот же объект
array_filter сохраняет ключи. После удаления нулевого элемента остаются ключи 1 и 2, поэтому json_encode создаёт объект. Функция array_values заново нумерует элементы с нуля — после неё получается JSON-массив.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: array_filter - Manual
Filters elements of an array using a callback function
🥰6
PHP 8.4. Что выведет код?
<?php
$values = [10, 20];
var_dump(in_array('10', $values));
var_dump(in_array('10', $values, true));
👾 — false, затем false
👍 — true, затем true
🥰 — false, затем true
⚡️ — true, затем false
По умолчанию in_array использует нестрогое сравнение: числовая строка '10' совпадает с числом 10. Третий аргумент true включает проверку типа. Строка и целое число тогда не совпадают.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: in_array - Manual
Checks if a value exists in an array
⚡6🥱2
PHP 8.4. Что выведет код?
<?php
$value = '0';
var_dump(empty($value));
var_dump($value === '');
👾 — true, затем false
👍 — false, затем false
🥰 — true, затем true
⚡️ — false, затем true
Проверка empty считает строку '0' пустым значением, потому что при преобразовании в bool она даёт false. Строгое сравнение с '' проверяет именно пустую строку. Строка '0' содержит один символ, поэтому результат — false.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: empty - Manual
Determine whether a variable is empty
👍5👾3
PHP 8.4. Что выведет код?
<?php
function prepare(): int {
echo "prepare\n";
return 1;
}
$item = null;
$result = $item?->run(prepare());
var_dump($result);
👾 — prepare, затем NULL
👍 — Только NULL
🥰 — Ошибку вызова метода у null
⚡️ — Ничего
Оператор ?-> останавливает вычисление, если слева находится null. До вызова метода и вычисления его аргументов дело не доходит. Поэтому prepare() не выполняется, а результат выражения равен null.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: The Basics - Manual
👍3⚡1
PHP 8.4. Что выведет код?
<?php
class Base {
public static function name(): string {
return 'B';
}
public static function show(): void {
echo self::name(), static::name();
}
}
class Child extends Base {
public static function name(): string {
return 'C';
}
}
Child::show();
👾 — BB
👍 — CC
🥰 — BC
⚡️ — CB
self:: обращается к классу, в котором написан метод show, — это Base. Вызов через static:: учитывает класс, через который вызвали метод. Здесь это Child, поэтому выбирается его реализация name.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: Late Static Bindings - Manual
🥰3⚡1
PHP 8.4. Что выведет код?
<?php
echo "sum=" . 1 + 2;
👾 — 2
👍 — sum=12
🥰 — TypeError
⚡️ — sum=3
В PHP 8 оператор + имеет более высокий приоритет, чем точка. Выражение читается как "sum=" . (1 + 2). Сначала складываются числа, затем результат присоединяется к строке.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: Operator Precedence - Manual
⚡4👍2
PHP 8.4. Что выведет код?
<?php
function numbers(): Generator {
yield 1;
return 7;
}
$generator = numbers();
foreach ($generator as $value) {
echo $value, ' ';
}
echo $generator->getReturn();
👾 — 1 7
👍 — 1 7 7
🥰 — Только 1
⚡️ — Исключение при вызове getReturn()
Цикл получает значения, выданные через yield, — здесь только единицу. Значение из return хранится отдельно. После завершения генератора его можно получить методом getReturn().
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: Generator::getReturn - Manual
Get the return value of a generator
👾2
PHP 8.4. Что выведет код?
<?php
$values = [
1 => 'A',
'1' => 'B',
'01' => 'C',
];
echo count($values), PHP_EOL;
echo $values[1], PHP_EOL;
echo $values['01'], PHP_EOL;
👾 — 3, A, C
👍 — 2, A, C
🥰 — 1, C, C
⚡️ — 2, B, C
Строковый ключ "1" преобразуется в целое число 1. Вторая запись перезаписывает значение A значением B.
Ключ "01" остаётся строкой: ведущий ноль мешает такому преобразованию. В массиве сохраняются два элемента.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡4
7 ноября (в эту субботу!) в 15:00 МСК приходи онлайн на открытое собеседование. Посмотришь, как проходит настоящее интервью на Middle PHP-разработчика.
Как это будет:
📂 Глеб Виноградов, Staff Software Engineer в Ad Tyres International, ex-Lead в Bumble, проведёт собес. У Глеба больше 11 лет в разработке. В Bumble он 4 года писал бэкенд для приложений Bumble и Badoo;📂 Глеб задаст реальные вопросы с технических секций и прокомментирует ответы;📂 В конце можно будет задать ему любой вопрос.
Участие бесплатное. Эфир проходит в рамках менторской программы ШОРТКАТ для разработчиков, которые хотят сменить работу, повысить грейд и зарплату или прокачать навыки.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_php_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
PHP 8.4. Что выведет код?
<?php
$defaults = ['theme' => 'light'];
$user = ['theme' => 'dark'];
$config = [...$defaults, ...$user];
echo $config['theme'];
👾 — dark
👍 — light
🥰 — lightdark
⚡️ — Возникнет ошибка из-за повторяющегося ключа
При распаковке массивов более позднее значение перезаписывает предыдущее с тем же строковым ключом.
Здесь настройки пользователя идут после настроек по умолчанию, поэтому theme получает значение dark.
Please open Telegram to view this post
VIEW IN TELEGRAM
👾3