PHP PHP  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Лёгкий  · 

Наследование, интерфейсы и traits

Тест проверяет границы полиморфизма: что обещает интерфейс, что наследует класс и как trait влияет на разрешение методов. Несколько вопросов требуют выбрать композицию или явный контракт вместо удобного, но хрупкого наследования.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. Сначала определите контракт, затем проследите, откуда PHP возьмёт конкретный метод. На работу дано 55 минут.
Вопрос 1 из 20
Что выведет вызов?
PHP
class Animal { public function sound(): string { return 'animal'; } }
class Dog extends Animal { public function sound(): string { return 'dog'; } }
echo (new Dog())->sound();
Вопрос 2 из 20
Что запрещает final перед методом?
PHP
class BaseFormatter
{
    final public function format(string $value): string
    {
        return trim($value);
    }
}
Вопрос 3 из 20
Почему Square extends Rectangle может нарушать подстановку, если setWidth и setHeight независимы у Rectangle?
Вопрос 4 из 20
Что выведет метод наследника, который явно вызывает parent::label() и дополняет результат?
PHP
class Base { protected function label(): string { return 'base'; } }
class Child extends Base {
 public function label(): string { return parent::label().'-child'; }
}
echo (new Child())->label();
Вопрос 5 из 20
Когда композиция обычно лучше наследования?
Вопрос 6 из 20
Что гарантирует type-hint Logger $logger, где Logger — интерфейс?
PHP
interface Logger
{
    public function info(string $message): void;
}
function run(Logger $logger): void
{
    $logger->info('Запуск');
}
Вопрос 7 из 20
Может ли класс реализовать несколько интерфейсов?
Вопрос 8 из 20
Что неверно в реализации?
PHP
interface Sink { public function write(string|int $value): void; }
class IntSink implements Sink {
 public function write(int $value): void {}
}
Вопрос 9 из 20
Зачем принимать ClockInterface вместо вызова new DateTimeImmutable() внутри сервиса?
Вопрос 10 из 20
Что произойдёт, если класс не реализовал обязательный метод интерфейса и не объявлен abstract?
Вопрос 11 из 20
Что делает use Timestamped внутри класса?
PHP
trait Timestamped { public function touched(): bool { return true; } }
class Note { use Timestamped; }
var_dump((new Note())->touched());
Вопрос 12 из 20
Какой риск у trait, который обращается к $this->connection, но сам не объявляет контракт?
PHP
trait UsesConnection
{
    public function save(string $value): void
    {
        $this->connection->insert($value);
    }
}
class Report
{
    use UsesConnection;
}
Вопрос 13 из 20
Может ли trait содержать abstract-метод?
Вопрос 14 из 20
Какое значение вернёт второй вызов метода inc() у того же объекта?
PHP
trait Counter { private int $n=0; public function inc(): int { return ++$this->n; } }
class Job { use Counter; }
$j=new Job(); $j->inc(); echo $j->inc();
Вопрос 15 из 20
Почему большой trait с десятком несвязанных обязанностей опасен?
Вопрос 16 из 20
В блоке use Small, Big { ... } нужно выбрать реализацию Small::format и устранить конфликт. Какая директива делает именно это?
PHP
trait Small { public function format(){ return 'S'; } }
trait Big   { public function format(){ return 'B'; } }

// В class View конфликт format() нужно разрешить явно.
Вопрос 17 из 20
Как сохранить проигравший метод Big::format под именем bigFormat?
Вопрос 18 из 20
Какое значение вернёт метод, предоставленный трейтом и переопределённый в самом классе?
PHP
trait Small { public function format(){return 'S';} }
trait Big { public function format(){return 'B';} }
class View { use Small, Big {
 Small::format insteadof Big;
 Big::format as bigFormat;
}}
$v=new View(); echo $v->format().'-'.$v->bigFormat();
Вопрос 19 из 20
Можно ли через as изменить видимость метода trait?
Вопрос 20 из 20
Класс объявляет собственный метод с тем же именем, что trait. Какая реализация имеет приоритет?

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

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

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

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