PHP PHP  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Атрибуты и рефлексия

Тест отделяет декларативное описание от поведения, которое действительно реализует программа. Нужно находить атрибуты через Reflection, проверять их область применения и решать, где динамика оправдана, а где скрывает контракт.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. Не считайте атрибут исполняемым сам по себе: найдите код, который его читает и применяет. Время — 70 минут.
Вопрос 1 из 25
Как объявить класс атрибута?
PHP
#[\Attribute]
final class Route
{
    public function __construct(public string $path) {}
}
Вопрос 2 из 25
Когда выполняется конструктор пользовательского атрибута?
PHP
$attrs=(new ReflectionMethod(C::class,'run'))->getAttributes(Route::class);
$route=$attrs[0]->newInstance();
Вопрос 3 из 25
Какой аргумент нужно добавить к #[Attribute(...)] у класса Route, чтобы атрибут разрешалось ставить только на методы?
PHP
final class UserController
{
    #[Route('/users')]
    public function index(): void {}
}
Вопрос 4 из 25
Что нужно для многократного применения одного атрибута к цели?
PHP
#[\Attribute(\Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
final class Middleware
{
    public function __construct(public string $name) {}
}
Вопрос 5 из 25
Что хранит атрибут до newInstance?
Вопрос 6 из 25
Что возвращает ReflectionClass::getMethods()?
PHP
final class UserController
{
    public function show(): void {}
    private function hydrate(): void {}
}
$methods = (new ReflectionClass(UserController::class))->getMethods();
Вопрос 7 из 25
Как узнать, допускает ли параметр значение по умолчанию?
PHP
function send(string $address, int $attempts = 3): void {}
$parameter = (new ReflectionFunction('send'))->getParameters()[1];
var_dump($parameter->isDefaultValueAvailable());
Вопрос 8 из 25
Почему нельзя всегда приводить getType() к ReflectionNamedType?
PHP
function parse(int|string $value): void {}
$type = (new ReflectionFunction('parse'))->getParameters()[0]->getType();
var_dump($type::class);
Вопрос 9 из 25
Что выведет строковое представление типа параметра функции?
PHP
function f(int|string $v){}
$p=(new ReflectionFunction('f'))->getParameters()[0];
echo $p->getType();
Вопрос 10 из 25
Можно ли вызвать private-метод через Reflection в современном PHP?
Вопрос 11 из 25
Почему карта маршрутов должна проверять дубли при сборке?
PHP
$map = [];
foreach ($controllerMethods as $method) {
    foreach ($method->getAttributes(Route::class) as $attribute) {
        $route = $attribute->newInstance();
        $key = $route->method . ' ' . $route->path;
        if (isset($map[$key])) {
            throw new LogicException("Дублирующий маршрут: $key");
        }
        $map[$key] = $method->getName();
    }
}
Вопрос 12 из 25
Какой атрибут лучше для обязательного поля DTO?
PHP
#[\Attribute(\Attribute::TARGET_PROPERTY)]
final class Required {}

final class RegistrationData
{
    #[Required]
    public string $email;
}
Вопрос 13 из 25
Почему нельзя считать наличие #[Authenticated] полной защитой?
Вопрос 14 из 25
Что лучше хранить в Route?
Вопрос 15 из 25
Как отфильтровать атрибуты, являющиеся наследниками базового Validator?
Вопрос 16 из 25
Почему сканирование всех файлов рефлексией на каждом запросе плохо масштабируется?
PHP
$routes = [];
foreach ($classes as $class) {
    $reflection = new ReflectionClass($class);
    foreach ($reflection->getMethods() as $method) {
        $routes[] = $method->getAttributes(Route::class);
    }
}
Вопрос 17 из 25
Что даёт compiled container?
PHP
final class CompiledContainer
{
    public function mailer(): Mailer
    {
        return new Mailer($this->logger(), $this->transport());
    }
}
Вопрос 18 из 25
Когда простая Reflection уместна без сложного кэша?
Вопрос 19 из 25
Почему кэш метаданных нужно инвалидировать при выпуске?
Вопрос 20 из 25
Что измерять при оптимизации рефлексии?
Вопрос 21 из 25
Как обнаружить неверный аргумент атрибута до первого запроса?
PHP
$reflection = new ReflectionClass($controller);
foreach ($reflection->getAttributes() as $attribute) {
    $attribute->newInstance();
}
Вопрос 22 из 25
Что включить в сообщение об ошибке метаданных?
PHP
try {
    $metadata = $attribute->newInstance();
} catch (Throwable $error) {
    throw new RuntimeException(sprintf(
        '%s::%s, атрибут %s, аргументы %s',
        $class,
        $method,
        $attribute->getName(),
        json_encode($attribute->getArguments(), JSON_THROW_ON_ERROR)
    ), 0, $error);
}
Вопрос 23 из 25
Как протестировать Route без запуска сервера?
Вопрос 24 из 25
Класс атрибута переименован, но старые метки остались. Какой симптом?
Вопрос 25 из 25
Почему тест только getAttributes() может пропустить ошибку?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу