Обложка: 5 вопросов с собеседования на позицию Junior backend-разработчика на PHP

5 вопросов с собеседования на позицию Junior backend-разработчика на PHP

Тимофей Житков

Тимофей Житков

старший преподаватель в Nordic IT School и Senior Full Stack Developer в агентстве недвижимости

К нам на курс по web-разработке приходят люди с разной подготовкой и абсолютно разного возраста. В связи с тем, что спрос на IT специалистов стремительно растет, очень многие захотели сменить специальность и попробовать себя в этой перспективной отрасли.

Естественно, все студенты задаются вопросом трудоустройства. Мы дорожим каждым учеником и своей репутацией, поэтому всячески содействуем их будущему. В частности, помогаем в составлении резюме и готовим к собеседованиям, а наши преподаватели (ведущие специалисты таких компаний как Сбербанк, Яндекс, Додо Пицца и т.д.) готовы давать рекомендации перспективным студентам.

Мы, в Noric IT School, готовим специалистов, которые уже к середине курса могут решать практические задачки, которые дают в качестве тестовых в различных IT компаниях.

И вот несколько самых популярных заданий, с которыми сталкиваются начинающие backend-разработчики на php, с примерами их решения.

Напишите функцию Фибоначчи

Числа Фибоначчи – это ряд чисел, в котором каждое следующее число равно сумме двух предыдущих: 1, 1, 2, 3, 5, 8, 13…

Конечно, нужно понимать формулу для того, чтобы заложить ее в код:

Fn = Fn-1 + Fn-2  , n — порядковый номер элемента

<?php
function fibonacci($n) {
   if ($n == 0 ) {
       return 0;
   }
   if ($n == 1 || $n == 2) {
       return 1;
   } else {
       return fibonacci($n - 1) + fibonacci($n -2);
   }
}

Задача на подсчет количества

В данном примере функция получает количество «программистов», на выдаче — правильное склонение слова «программист».

ТЗ: Написать функцию, которая будет параметром принимать целое число (программистов), а на выходе давать это же число + слово “программист” в склонении, соответствующем заданному числу.

Пример: 2 программистА

11 программистОВ

1 программист[ ]

Решение:

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

0 — программистов (про ноль не забываем — он в программировании очень важен)

1 — программист

2 — программиста

3 — программиста

4 — программиста

5 — программистов

6 —  программистов

7 —  программистов

8 — программистов

9 — программистов

10 — программистов

11 — программистов

12 — программистов

13 — программистов

14 — программистов

15 — программистов

16 — программистов

17 — программистов

18 — программистов

19 — программистов

20 — программистов

21 — программист

22 — программиста

Все, перебрали варианты.

В данном случае, чтобы понять закономерность, нужно смотреть остаток от деления на 10, а в каких-то случаях на 100. В зависимости от остатка, определить верное склонение и вывести его.

Обновление По просьбе автора код данного примера обновлён 7 марта 2021 г.

<?php
function countCoders($number) {
   $divTen = $number % 10;
   $divHund = $number % 100;

   if ($divHund > 10 && $divHund < 21) { 
       $word = ' программистов'; 
   } elseif ($divTen > 1 && $divTen < 5) {
       $word = ' программиста';
   } elseif ($divTen == 1) {
       $word = ' программист';
   } else {
       $word = ' программистов';
   }
   return $number . $word;

}

Расскажите про наследование в PHP

Здесь есть один тонкий момент, на котором бывает «валятся» даже сами специалисты, которые проводят интервью.

Решение:  

Наследование — это один из 3-х постулатов ООП (еще полиморфизм и инкапсуляция), который нужен для того, чтобы сильно сократить количество кода и сделать его более удобным для управления. Суть наследования проста: если у вас есть несколько классов (например: User, Message и Comment), с большим количеством идентичных методов (читай копипастных), то можно взять все повторяющиеся методы и вынести их в какой-нибудь новый класс, например, Unit и, с помощью слова extends, подключить все эти методы из Unit в User, Message и Comment.

<?php

    class Unit
    {
        // метод создания новой строки в таблице БД
        public function createLine(array  $fields,array $values)
 { ...}

	  // метод обновления строки в таблице БД
        public function updateLine(array  $fields,array $values) 
  { ...}

	  // метод удаления строки в таблице БД
        public function deleteLine() { ...}	

	  // метод получения строки в таблице БД
        public function getLine() { ...}	

   }

    // класс B наследует свойства и методы класса A
    // но у себя он переопределяет свойство $name
    class User extends Unit {
        /* свои свойства и методы  */
    }

	class Message extends Unit {
        /* свои свойства и методы  */
    }

class Comment extends Unit {
        /* свои свойства и методы  */
    }

Какой профит? Польза в том, что, теперь, вы пишете методы не три раза, а всего один (код сильно сократился). И теперь, если в каком-то методе вдруг что-то нужно поменять, то меняете это в одном месте, а изменения применяются везде.

Тонкий момент: в PHP нет множественного наследования, то есть нельзя в одном классе наследовать методы от двух и более классов.

НО для интерфейсов (не графических) — множественное наследование есть.

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

Ответ: для решения этого вопроса используются Трейты и интерфейсы.

Расскажите чем static отличается от self

Это классический вопрос на позднее статическое связывание, который задают как джунам (реже), так и синьорам.

Решение:  

Механизм позднего статического связывания (Late Static Binding) нужен для того, чтобы достучаться до статических свойств (методов), или констант родительского класса в дочерних, даже если они уже переопределены.

Пример:

<?php

    class A
    {
 // защищенное статическое свойство содержит имя класса
        protected static $name = ‘это свойство класса A!’;

   
 // просто возвращает имя класса, причем ключевое слово self
 // будет возвращать свойство $name из того места, где эта
 // переменная определена изначально
        public static function getName() {
            return self::$name;
        }

 // эта функция тоже возвращает свойство $name
 // но уже не из родительского, а из дочерних классов
        public static function getNameSB() {
           
 // ключевое слово static
            return static::$name;
        }

    }

 // класс B наследует свойства и методы класса A
 // но у себя он переопределяет свойство $name
    class B extends A {
        protected static $name = ‘это свойство класса B!’;
    }


    echo A::getName(); // это свойство класса A!
    echo B::getName(); // это свойство класса A!

    echo A::getNameSB(); // это свойство класса A!
    echo B::getNameSB(); // это свойство класса B!

Применить этот механизм можно, например, когда нужно вынести общую логику работы с несколькими таблицами в БД в родительский класс.

Расскажите, что такое $_GET и $_POST и в чем их разница

Вопрос классический и основополагающий, если кандидат не отвечает на него, значит скорее всего это «мимо».

Решение:

$_GET — это, великодушно созданный для нас языком, суперглобальный ассоциативный массив, в котором находятся расфасованные GET параметры — то есть те, что передались в адресной строке или URL после знака ?

$_POST — такой же ассоциативный массив но уже собранный из POST параметров — то есть тех, что передаются в теле запроса.

Вопрос на засыпку: (почему-то многие не отвечают) «а как еще можно получить POST параметры в PHP«?

Ответ:  $_POST это форматированное и подготовленное для удобной работы тело запроса, но есть вариант получить тело запроса «как есть»  с помощью:

file_get_contents('php://input')

Можно встретить такое, например при создании telegram-бота.