Библиотека задач по PHP | тесты, код, задания
2.28K subscribers
330 photos
6 videos
169 links
Задачи и тесты по PHP для тренировки и обучения.

По рекламе: @tproger_sales_bot

Учиться у нас: clc.to/JE-DRA

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
😭 Как не потратить недельный лимит AI-кодинга за три дня?

Разберём на вебинаре, как тратить меньше на AI-агентов — без потери качества кода.

🔘 Поговорим о том:

— когда дорогая модель действительно нужна, а когда хватит дешёвой;
— сколько стоит один прогон и куда уходят токены;
— какие задачи можно отдавать субагентам;
— как настроить маршрутизацию моделей;
— что проверять в AI-коде перед merge.

✏️ Покажем всё на конкретных цифрах и вживую: сравним расходы до и после.

⬇️ 17 сентября, 19:00 МСК
⬇️ 1,5 часа · бесплатно
⬇️ Арсений Харланов и Олег Лайок

💬 Пишите в комментариях, где упираетесь в лимиты и на что уходят деньги. Самые залайканные вопросы разберём на вебинаре.

🔗 Зарегистрироваться на вебинар⁠
Please open Telegram to view this post
VIEW IN TELEGRAM
Что будет результатом кода?

👍 — world hello
👾— FiberError
🥰— hellohello world
❤️— hello world
❤5🔥2🥰1🥱1
PHP 8.4. Чему равно выражение array_is_list([0 => 'a', 2 => 'b'])?
Anonymous Quiz
36%
true
57%
false
4%
null
3%
TypeError
Forwarded from Библиотека программиста
👀 Как вы смотрите видео?

Разбираете урок, слушаете интервью фоном или начинаете на телефоне, а продолжаете на большом экране?

Хотим узнать, что делает просмотр удобным для вас. Вспомните последнее видео — ролик, урок, фильм или серию сериала — и расскажите о своём опыте. Если детали не запомнились, можно так и ответить.

🕰️ Опрос займёт около 3 минут.

В результатах сможете сравнить свои привычки с ответами других участников. А разработчики и инженеры видеоплатформы расскажут, что происходит по ту сторону экрана, пока вы смотрите видео.

🔗 Поделиться опытом

🐸 Библиотека программиста
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%
Ошибка
❓ Чем сложение массивов через + отличается от array_merge?

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
⚡️ — Ошибка: массивы нельзя складывать

Ответ: 👍 — 10 20.

Оператор + объединяет массивы по ключам и при совпадении сохраняет значение из левого массива. array_merge для одинаковых строковых ключей берёт значение из более позднего массива. Здесь ключ timeout строковый: правила перенумерации числовых ключей не участвуют.

Правило в документации PHP

🐸 Библиотека задач по PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
😎 Выбираешь один курс, второй получаешь бесплатно. Баг? Нет, акция!

До 31 октября в Proglib Academy можно выбрать два курса и заплатить только за один.

Например, можно совместить:

💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.

💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.


Вместе курсы стоят 108 000 ₽, но по акции оба обойдутся в 59 000 ₽. Экономия — 49 000 ₽ 🔥

Интересуют Python и ИИ или алгоритмы и архитектура? Можно выбрать любые два курса из каталога.

Акция действует до 31 октября включительно ⏳

⏬ Собрать свой учебный билд
Please open Telegram to view this post
VIEW IN TELEGRAM
❓ Почему isset и array_key_exists по-разному проверяют один ключ?

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

Ответ: ⚡️ — false, затем true.

isset возвращает false, если значение равно null. array_key_exists проверяет наличие самого ключа, а не значение под ним. Ключ token существует, хотя в нём хранится null.

Правило в документации PHP

🐸 Библиотека задач по PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡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
⚡️ — Ошибка компиляции

Ответ: 👾 — 10 20.

Стрелочная функция автоматически захватывает внешнюю переменную по значению: для arrow сохраняется число 10. Замыкание с use (&$value) захватывает переменную по ссылке и при вызове видит уже 20. В задаче используется число, а не объект.

Правило в документации PHP

🐸 Библиотека задач по PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
👾4
❓ Скопирует ли clone объект во вложенном свойстве?

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

Ответ: 🥰 — Bob.

Без дополнительной логики __clone выполняется поверхностное копирование свойств. original и copy — разные объекты User, но их свойства profile указывают на один Profile. Изменение его name видно через оба контейнера. Для независимого Profile его нужно клонировать отдельно.

Правило в документации PHP

🐸 Библиотека задач по PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2⚡1🥰1
📌 Один курс — хорошее вложение в себя. Два по той же цене — ещё лучше.

В Proglib Academy действует акция: покупаешь один курс, а второй получаешь в подарок.

Например, можно совместить два направления по работе с ИИ:

💥 ИИ для разработчиков — применение нейросетей в повседневной разработке: работа с кодом, тестирование и ревью.

💥 Разработка ИИ-агентов — архитектура агентов и создание собственных AI-решений.


📍 Разница в цене — почти 50 тысяч рублей. Можно освоить больше, не выходя за рамки запланированного бюджета.

А если тебе интереснее Python, алгоритмы, backend или DevOps — выбирай другую пару курсов из каталога.

Акция действует до 31 октября включительно ⏳

⏮️ Пора прокачать свой стек
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱2
❓ Какую ветку match выберет для строки с числом?

PHP 8.4. Что выведет код?

<?php
$value = '1';

$result = match ($value) {
1 => 'integer',
'1' => 'string',
default => 'other',
};

echo $result;


👾 — integer
👍 — string
🥰 — other
⚡️ — UnhandledMatchError

Ответ: 👍 — string.

match сравнивает значение с вариантами строго, как оператор ===. Строка '1' не равна целому числу 1 при таком сравнении. Совпадает вторая ветка, поэтому результат — string.

Правило в документации PHP

🐸 Библиотека задач по PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
❓ Можно ли изменить объект внутри readonly-свойства?

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

Ответ: ⚡️ — Bob.

readonly запрещает после инициализации переназначать свойство user, но не делает сам объект User неизменяемым. Изменение его обычного свойства name допустимо. А присваивание $box->user = new User() после инициализации привело бы к Error.

Правило в документации PHP

🐸 Библиотека задач по PHP
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡6👾3
❓ Почему второй foreach меняет последний элемент массива?

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
⚡️ — Ошибка выполнения

Ответ: 👍 — 1,2,2.

После первого цикла $value остаётся ссылкой на последний элемент массива. Второй цикл присваивает ей очередные значения и тем самым меняет этот элемент. Чтобы убрать связь, после цикла по ссылке нужно вызвать unset($value).

Документация: foreach по ссылке

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
❓ Почему после фильтрации JSON-массив стал объектом?

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}, затем тот же объект

Ответ: 🥰 — {"1":1,"2":2}, затем [1,2].

array_filter сохраняет ключи. После удаления нулевого элемента остаются ключи 1 и 2, поэтому json_encode создаёт объект. Функция array_values заново нумерует элементы с нуля — после неё получается JSON-массив.

Документация: array_filter • Документация: json_encode

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6
❓ Найдёт ли in_array строку среди целых чисел?

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

Ответ: ⚡️ — true, затем false.

По умолчанию in_array использует нестрогое сравнение: числовая строка '10' совпадает с числом 10. Третий аргумент true включает проверку типа. Строка и целое число тогда не совпадают.

Документация: in_array

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡6🥱2
❓ Пустая ли строка '0'?

PHP 8.4. Что выведет код?

<?php

$value = '0';

var_dump(empty($value));
var_dump($value === '');


👾 — true, затем false
👍 — false, затем false
🥰 — true, затем true
⚡️ — false, затем true

Ответ: 👾 — true, затем false.

Проверка empty считает строку '0' пустым значением, потому что при преобразовании в bool она даёт false. Строгое сравнение с '' проверяет именно пустую строку. Строка '0' содержит один символ, поэтому результат — false.

Документация: empty

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍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.

Оператор ?-> останавливает вычисление, если слева находится null. До вызова метода и вычисления его аргументов дело не доходит. Поэтому prepare() не выполняется, а результат выражения равен null.

Документация: nullsafe operator

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3⚡1
❓ Почему self:: и static:: вызывают разные методы?

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

Ответ: 🥰 — BC.

self:: обращается к классу, в котором написан метод show, — это Base. Вызов через static:: учитывает класс, через который вызвали метод. Здесь это Child, поэтому выбирается его реализация name.

Документация: позднее статическое связывание

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰3⚡1
❓ Что выполнится раньше: сложение или склеивание строки?

PHP 8.4. Что выведет код?

<?php

echo "sum=" . 1 + 2;


👾 — 2
👍 — sum=12
🥰 — TypeError
⚡️ — sum=3

Ответ: ⚡️ — sum=3.

В PHP 8 оператор + имеет более высокий приоритет, чем точка. Выражение читается как "sum=" . (1 + 2). Сначала складываются числа, затем результат присоединяется к строке.

Документация: приоритет операторов

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡4👍2
❓ Попадёт ли return генератора в foreach?

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()

Ответ: 👾 — 1 7.

Цикл получает значения, выданные через yield, — здесь только единицу. Значение из return хранится отдельно. После завершения генератора его можно получить методом getReturn().

Документация: Generator::getReturn

➡️ Навигация: База знаний • Задачи • Собеседования • Вакансии

🐸 Библиотека программиста
Please open Telegram to view this post
VIEW IN TELEGRAM
👾2