You get a bonus - 1 coin for daily activity. Now you have 1 coin

Conclusion - PHP Interview Questions and Answers

Lecture



Это окончание невероятной информации про php ответы для собеседований.

...

/> С массивами связана значительная часть процесса разработки на PHP. Они хорошо подходят для тех случаев, когда вам необходима итерируемая структура данных. Изнутри массивы представлены, как и многие другие структуры данных, в виде хэш-таблиц. PHP написан на C, в котором нет ассоциативных массивов – массивы в C могут иметь только целочисленные индексы. Для трансляции индексов PHP-массива в целочисленные индексы массива на C применяется хэш-функция, преобразующая индексы PHP-массива (и целочисленные, и строковые) в целые числа. Значения элементов массива располагаются в получившейся хеш-таблице.
Сложность процесс поиска элементов по хэш-ключам составляет O(1) (в нотации большое О) благодаря тому, что для нахождения элемента не требуется итерация по хешу (хеш-функция возвращает значение, точно указывающее на положении элемента в таблице).

Прим. переводчика: Здесь я сознательно исключил из текста понятие бакета (bucket, корзина), т.к. автор оригинального текста не даёт никаких пояснений на его счет. Если вам действительно интересно устройство хеш-таблиц, то рекомендую к прочтению вот этот материал.

PHP автоматически увеличивает размер массива по требованию. В том числе в тех ситуациях, когда добавление нового элемента может вызвать превышение размера выделенной на данный момент области памяти, PHP удваивает размер выделенной памяти.

В некоторых случаях процесс добавления элемента в массив так же сложен, как итерация с копированием элементов в новый массив, да еще и с удвоением выделенной памяти. Учитывая это, для больших наборов данных с целью экономии памяти, возможно, стоит рассмотреть альтернативы массивам и загружать данные по мере необходимости. Подробнее о внутреннем устройстве массивов можно почитать в разделе программирование на стороне сервера.
К списку вопросов

Вопрос : В чем различие между ArrayAccess и ArrayObject?


ArrayAccess – это просто интерфейс, требующий определения следующих методов: offsetGet, offsetSet, offsetExists, иoffsetUnset.

ArrayObject – класс, реализующий интерфейс ArrayAccess. Удобство ArrayObject заключается в том, что к его свойствам можно получать доступ таким же образом, как к обычному массиву через оператор [], например: $dogs['sound'], или через метод offsetGet('имя свойства'), например: $dogs->offsetGet('sound').
Подробнее об использовании объектов как массивов.
К списку вопросов

Вопрос : Что такое генераторы? Когда их можно использовать вместо итераторов и обычных массивов? Для чего нужны ключевые слова yield и send?


Генератор внешне похож на обычную функцию, и обладает некоторым сходством с замыканиями. При первом вызове в контексте итератора (например, в цикле foreach), генератор возвращает объекта класса Generator, который, в свою очередь, реализует интерфейс Iterator. Значения для итерации генерируются в реальном времени, что избавляет от необходимости загружать весь набор данных в память, получая значения по мере необходимости. Из этого следует, что итерация по результату осуществляется так же, как по массиву, не считая некоторых отличий:

  1. итерация направлена только вперед, нельзя вернуться к предыдущему значению или к началу. Вызов методаrewind() выбросит исключение;
  2. скорость выполнения итерации ниже, чем в случае с предварительно заполненным массивом, т.к. для получения следующего значения генератор выполняет какие-то действия;
  3. крайне эффективное использование памяти.



Невозможность возврата значения через оператор return – это одно из основных отличий генератора от других функций или замыканий. Вместо него для передачи значения из генератора применяется ключевое слово yield (например, yield $dog). Указание значения после return приведет к синтаксической ошибке, а применение пустого оператора – простой способ остановить работу генератора.

Оператор yield приостанавливает выполнение и возвращает текущее значение в контекст структуры, использующей генератор. Эта структура может отправить информацию обратно в генератор во время его выполнения с помощью метода send (например, $generator->send(-1);).

Пример кода с использованием генератораСначала объявим сам генератор:

function dog_generator() {
    foreach (range(0, 2) as $value) {
        // некоторый ложный источник данных
        $dog = DogHelper::getDogFromDataSource($value);
        // перехватываем input от send или используем $dog
        $input = (yield $dog);    
        if ($input == -1) {
             return; // останавливаем генератор
         }
     }
 }


Стоит отметить, что в приведенном выше коде мы сохраняем результат выполнения yield в переменную, для этого мы обернули его вызов в круглые скобки.

А теперь напишем код, использующий объявленный генератор:

// получаем экземпляр генератора и присваиваем его переменной
$generator = dog_generator();
foreach ($generator as $dog) { // $dog - это результат вызова yield
    echo $dog . PHP_EOL;
    // мы хотим найти терьера
    if ($dog == 'Terrier') {
        // отправляем входные данные генератору через yield
        $generator->send(-1);
        echo 'Мы нашли терьера, останавливаем просмотр';
     }
 }


Если запустить этот код, то он прекратит своё выполнение после обнаружения терьера:

 Dalmatian
Терьер
Мы нашли терьера, останавливаем просмотр


Основные преимущества генераторов можно свести к простоте реализации, повышению читаемости кода, повышению эффективности расходования памяти.
Вообще говоря, стоит применять генераторы всегда, когда не требуется повторно обходить набор данных с начала или просматривать его в обратном направлении. С другой стороны, если не учитывать расходование памяти, обход обычного массива выполняется значительно быстрее.
Документация по генераторам на php.net на русском языке пока что отсутствует.
К списку вопросов

Общая картина

Вопрос : Перечислите ключевые отличия между версиями PHP 5.3, 5.4, 5.5.


Версия PHP 5.3 была выпущена в июне 2009 года, но до сих пор широко распространена. Основные новшества: замыкания, лямбда-функции, пространства имён и позднее статическое связывание.

Релиз PHP 5.4 состоялся в марте 2012 года. В нём были представлены типажи (трейты), возможность объявления массива с коротким синтаксисом [] (например, ['шит-цу', 'ротвейлер']). Ко всему прочему, в этой версии была убрана опцияregister_globals.

PHP 5.5 был выпущен в июне 2013 года, и это текущий релиз. В этой версии появились генераторы (и связанное с ними ключевое слово yield), в инструкцию try/catch добавлен блок finally, на замену APC Cache пришел включённый по умолчанию OpCache (базируется на Zend Optimizer). Также был расширен синтаксис литералов массивов (['шит-цу','ротвейлер'][1] вернёт 'ротвейлер'), и добавлена удобная возможность обращения к символам в строке как к элементам массива (например, '6e8687d4'[0] вернёт «6»).

Имею опыт работы с:
Yii, Yii2, Phalkon, Angular.JS,Angular.2,Node.js, React.js,Vue.js

Опыт работы c laravel 5+
А что это? менее года , 1 год,2 года,3 года

Используете ли вы миграции в Laravel 5+?
Да Нет
Why

Используете ли вы репозитории в Laravel 5+?
Да Нет, Почему ?

Используете ли вы политики в Laravel 5+?
Да Нет,Почему ?

Используете ли вы Eloquent в Laravel 5+?
Да Нет,Почему ?

Используете ли вы Middleware в Laravel 5+?
Да , Нет,Почему ?

Используете ли вы Notification в Laravel 5+?
Да,Нет,Почему ?

Используете ли вы Events в Laravel 5+?
Да,Нет,Почему ?

Как вы бы использовали REST API в Laravel 5+?
Могу,Не могу, Коротко об этом

Какой Фреймворк вы использовали бы для высоконагруженного Laravel 5+? (angular,node.js,react.js ...)
Библиотеку, Фремворк, Почему и как?

В чем отличие команды Rebase от Merge в GIT
Понимаю,Не понимаю, Когда и как использовать эти команды можно/нельзя?

Что такое Laravel Homestead?
Понимаю, Не понимаю, для чего и как использовалось?

Conclusion


Прохождение интервью является навыком. Если вы замечательный программист — отлично, но этого недостаточно. Все когда-нибудь проваливают интервью, и должная подготовка может помочь каждому увеличить вероятность успеха. Энтузиазм чрезвычайно важен, и для того, чтобы научиться правильно показывать его, вам стоит попрактиковаться. Из-за недостатка энтузиазма на собеседованиях терпят неудачу столько же программистов, сколько проваливаются по техническим причинам. Интервьюеры помогают кандидатам во время интервью, и если вы будете правильно вести себя и правильно общаться, то они обязательно вам помогут. Практика всегда помогает. Чтение большого количества задаваемых на собеседованиях вопросов и приучение самого себя к испытываемому на собеседованиях стрессу обеспечит вам успех и получение большего количества предложений работы.

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

Продолжение:


Часть 1 PHP Interview Questions and Answers
Часть 2 Conclusion - PHP Interview Questions and Answers


Comments


To leave a comment
If you have any suggestion, idea, thanks or comment, feel free to write. We really value feedback and are glad to hear your opinion.
To reply

Running server side scripts using PHP as an example (LAMP)

Terms: Running server side scripts using PHP as an example (LAMP)