Forwarded from Библиотека программиста
Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране?
Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить.
В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео.
Please open Telegram to view this post
VIEW IN TELEGRAM
PHP 8.4. В WeakMap есть один ключ-объект со значением 123. После unset последней обычной ссылки на объект что вернёт count($map)?
Anonymous Quiz
39%
0
25%
1
26%
null
10%
Ошибка
PHP 8.4. Что выведет код?
<?php
$left = ['timeout' => 10];
$right = ['timeout' => 20];
$union = $left + $right;
$merged = array_merge($left, $right);
echo $union['timeout'], ' ', $merged['timeout'];
👾 — 20 20
👍 — 10 20
🥰 — 10 10
⚡️ — Ошибка: массивы нельзя складывать
Оператор + объединяет массивы по ключам и при совпадении сохраняет значение из левого массива. array_merge для одинаковых строковых ключей берёт значение из более позднего массива. Здесь ключ timeout строковый: правила перенумерации числовых ключей не участвуют.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: Array - Manual
Array Operators
👍8
До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.
Например, можно совместить:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽
Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.
Please open Telegram to view this post
VIEW IN TELEGRAM
PHP 8.4. Что выведет код?
<?php
$data = ['token' => null];
var_dump(isset($data['token']));
var_dump(array_key_exists('token', $data));
👾 — true, затем true
👍 — true, затем false
🥰 — false, затем false
⚡️ — false, затем true
isset возвращает false, если значение равно null. array_key_exists проверяет наличие самого ключа, а не значение под ним. Ключ token существует, хотя в нём хранится null.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: isset - Manual
Determine if a variable is declared and is different than null
⚡11
PHP 8.4. Что выведет код?
<?php
$value = 10;
$arrow = fn() => $value;
$reference = function () use (&$value) {
return $value;
};
$value = 20;
echo $arrow(), ' ', $reference();
👾 — 10 20
👍 — 20 20
🥰 — 10 10
⚡️ — Ошибка компиляции
Стрелочная функция автоматически захватывает внешнюю переменную по значению: для arrow сохраняется число 10. Замыкание с use (&$value) захватывает переменную по ссылке и при вызове видит уже 20. В задаче используется число, а не объект.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: Arrow Functions - Manual
👾4
PHP 8.4. Что выведет код?
<?php
class Profile {
public string $name = 'Ann';
}
class User {
public Profile $profile;
}
$original = new User();
$original->profile = new Profile();
$copy = clone $original;
$copy->profile->name = 'Bob';
echo $original->profile->name;
👾 — Ann
👍 — Ошибка: вложенный объект нельзя менять
🥰 — Bob
⚡️ — Ошибка: clone запрещён без __clone
Без дополнительной логики __clone выполняется поверхностное копирование свойств. original и copy — разные объекты User, но их свойства profile указывают на один Profile. Изменение его name видно через оба контейнера. Для независимого Profile его нужно клонировать отдельно.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2⚡1🥰1
В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.
Например, можно совместить два направления по работе с ИИ:
💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.
А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.
Акция действует до 31 октября включительно
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
PHP 8.4. Что выведет код?
<?php
$value = '1';
$result = match ($value) {
1 => 'integer',
'1' => 'string',
default => 'other',
};
echo $result;
👾 — integer
👍 — string
🥰 — other
⚡️ — UnhandledMatchError
match сравнивает значение с вариантами строго, как оператор ===. Строка '1' не равна целому числу 1 при таком сравнении. Совпадает вторая ветка, поэтому результат — string.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: match - Manual
👍11
PHP 8.4. Что выведет код?
<?php
class User {
public string $name = 'Ann';
}
class Box {
public function __construct(
public readonly User $user
) {}
}
$box = new Box(new User());
$box->user->name = 'Bob';
echo $box->user->name;
👾 — Ошибка: readonly запрещает любое изменение
👍 — Ann
🥰 — Ошибка: readonly нельзя применять к объектам
⚡️ — Bob
readonly запрещает после инициализации переназначать свойство user, но не делает сам объект User неизменяемым. Изменение его обычного свойства name допустимо. А присваивание $box->user = new User() после инициализации привело бы к Error.
Please open Telegram to view this post
VIEW IN TELEGRAM
www.php.net
PHP: Properties - Manual
⚡6👾3
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