Однажды мне написал HR lingualeo. Правда это было не один раз.. HR предложил заполнить анкету, им нужен был php разработчик в Москву (жаль не Тайланд).
Так вышло, что я не был уверен, что хочу ее заполнять, но все же заполнил. В виду того, что мне не ответили, я решил выложить свои ответы.
Не зря же я ее заполнял.
Я не считаю, что нарушаю тут какую-то секретность. Эту анкету HR высылают наверняка всем, и все отвечают по разному. Я прошу не использовать мои ответы в качестве своих.
Не списывать. :) В ответах я не претендую на правильность и оригинальность. Таким шрифтом добавлю еще комментарии.
Так же я просто хочу сохранить это для истории и как-то через пару лет сравнить новые ответы с этими.
to PHP or not to PHP?
* Обязательно
Что такое PHP?
Скриптовый язык с динамической типизацией, используемый в основном для веб приложений.
Что такое PHP-FPM?
Менеджер процессов php.
Изначально был патчем, сейчас отдельный пакет.
Работает в режиме FastCGI с несколькими дополнительными возможностями.
К процессу fpm можно обращатсья как через socket, так и через порт, например 8000, при конфигурировании веб сервера.
Если бы вы были разработчиком языка PHP, то какую фичу добавили бы в него?
Возможность строгой типизации.
Однозначно хотелось бы иметь возможность указывать тип переменной при создании, и при возвращении из метода. Но это может быть опционально. Интересная реализация этой возможность в языке hack.
Нормальную многопоточность, которая шла бы в стандартной установке. Не хватает Thread как в Java.
Возможно добавление виртуальной машины по умолчанию, типа HHVM, для реализации вышеперечисленного и производительности.
$a = 256; Сколько байт памяти будет использовать этот скрипт в PHP?
4 на 32bit платформе и 8 на 64bit платформе. (я гуглил)
Что быстрее JavaScript или PHP и почему?
В какой среде выполняется JavaScript ?
Если сравнивать PHP с клиентским выполнением JS, то тут все зависит от мощностей сервера и клиентской машины.
Если сравнивать PHP с node.js, то тут стоит учесть настройки окружения, а так же асинхронную архитектуру node.js.
JS в данном случае будет быстрее, например, при обращении к БД, node.js создаст отдельный процесс для этого запроса, а сам веб сервер продолжит отвечать на другие запросы. Node.js включает в себя веб сервер и висит в памяти.
В случае php веб сервер рабоатет отдельно, необходимо увеличивать кол-во разрешенных процессов. Иначе, в случае двух запросов, один из которых с обращением в БД, а другой нет, и оба они выполняются в одно процессе, то время ответа будет равно времени самого медленно запроса (с обращеним в БД).
На php можно писать в стиле node.js используя ReactPHP, Ratchet.
Чем отличается тип данных stdClass от array?
stdClass это пустой объект, встроенный в PHP.
array это примитивный тип данных, представляющий из себя key-value контейнер, не является объектом.
В каких случаях оправдано использование Exception’ов?
Во всех.
Имеет ли смысл использовать opcode кэш в cli режиме?
Только для тестирования, чтобы воссоздать окружение для PHPUnit.
Иначе нет смысла, т.к. сгенерированный кеш будет уничтожаться при каждом вызове скрипта. CLI не хранит кеш в памяти.
Какие существуют полезные примеры использования магических функций в PHP?
__toString() полезно для читабельного вывода информации об объекте
__get и __set могут быть использованы для какой-то логики, связанной с геттерами-сеттерами, например в коллекции.
Тут же близки методы __isset() и __unset(), которые сработают при проверках несуществующих свойств.
__call может быть использовано для делегирования, если нет такого метода в классе.
__callStatic то же самое, для static.
__invoke – когда класс можно вызывать как метод.
__sleep() и __wakeup() для сериализации объекта
__construct и __destruct для инициализации объекта и его уничтожения, соответсвенно. Первое полезно для задания зависимостей и начальной конфигурации. Второе для уничтожения ссылок, освобождения ресурсов.
__clone для задания логики клонирования объекта. Например, для инкремента идентификатора.
Магические методы могут быть крайне полезны при реализации какого-то функционала, но в реальных условиях желательно использовать их как можно меньше, т.к. это запутывает код.
Какую конфигурацию окружения и какие технологии вы бы использовали для запуска php приложения?
В качестве базы данных используется MySQL
MySQL (InnoDB т.к. транзакции, не блокирующий доступ при многопоточном обращении)
php5.5, т.к. хочется использовать все новые фичи, и скорость в новых версиях выше.
Nginx – очевидный выбор для высокопроизводительного сервера. Он же может быть прокси при масштабировании.
php5-fpm – очевидный выбор для производительности и управляемости исполнения php.
memcached – кеишрование
libevent – если используется event-loop
Gearman – сервер очередей
Далее по нуждам задачи.
Дано математическое выражение, нужно распечатать позиции открывающей и соответствующей закрывающей скобки. Порядок не имеет значения. Примеры: a*(b+c) => (2, 6); (a/(b+c))+d*(e-f) => (0, 8), (3, 7), (12, 16)
Напишите код на PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public function testBracesPositions() { $examples = [ "a*(b+c)", "(a/(b+c))+d*(e-f)", ]; foreach ($examples as $example) { $results[$example] = $this->findBracesPositions($example); } echo "<pre>"; print_r($results); echo "</pre> "; } public function findBracesPositions($string) { $finded = []; $findedIndexes = []; for ($i = 0; $i < strlen($string); $i++) { if ($string[$i] == ')') { for ($j = $i; $j >= 0; $j--) { if ($string[$j] == '(') { if (!in_array($j, $findedIndexes)) { $finded[] = array($j, $i); $findedIndexes[] = $j; break; } } } } } asort($finded); return $finded; } |
Напишите функцию, которая делает преобразование: ILovePHPAndXMLSoMuсh в i_love_php_and_xml_so_much
Решение “в лоб”
—-
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
public function testCaseToUnderscore() { $string = "ILovePHPAndXMLSoMuсh"; $expected = "i_love_php_and_xml_so_much"; $result = $this->upperCaseToUnderscore($string); echo "<pre>"; print_r($expected); echo "<pre>"; print_r($result); $result = $this->upperToUnderscoreRegular($string); echo "<pre>"; print_r($result); } public function upperCaseToUnderscore($string) { $result = ""; $beginWord = TRUE; for ($i = 0; $i < strlen($string); $i++) { if (ctype_upper($string[$i]) && $i > 0 && $beginWord) { $result .= "_" . strtolower($string[$i]); if ($string[$i + 1]) { if (ctype_lower($string[$i + 1])) { $beginWord = TRUE; } else { $beginWord = FALSE; } } } else { $result .= strtolower($string[$i]); if ($string[$i + 1]) { if (ctype_upper($string[$i]) && ctype_lower($string[$i + 1])) { $beginWord = TRUE; } } if ($beginWord == FALSE && $string[$i + 2]) { if (ctype_lower($string[$i + 2])) { $beginWord = TRUE; } else { $beginWord = FALSE; } } } } return $result; } |
—-
Или воспользоваться одним из регулярных выр-й, получив массив слов написать уже ф-ю.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
preg_match_all("/((?:^|[A-Z])[^A-Z]*)/", $string, $matches); preg_match_all("/([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9]*)|[A-Za-z][a-z0-9]+)/", $string, $matches); public function upperToUnderscoreRegular($string) { $string1 = preg_replace_callback( '/([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9]*)|[A-Za-z][a-z0-9]+)/', function($a) { if (strlen($a[0]) > 1) { return "_" . strtolower($a[0]); } return strtolower($a[0]); }, $string); return $string1; } |
Опишите, чем паттерн декоратор отличается от наследования?
Наследование реализует логическую операцию “является”. Наследование применяется для переопределения базового функционала, но может быть не всегда удобно в больших проектах.
Декоратор позволяет добавлять дополнительный функционал без создания наследников. При этом декораторы сами миогут быть организованы в структуру наследования и применяться к одному, или разным объектам подходящего типа.
В некоторых случаях декоратор более гибок.
Расскажите в каких ситуациях использование SQL JOIN не оправдано?
JOIN в принципе дорогостоящая операция. JOIN на InnoDB работает быстрее, чем с MyISAM.
JOIN не стоит использовать с колонками, на которых нет индексов. И в некоторых случаях замена JOIN на два отдельныъ запроса + IN() или на подзапросы – будет быстрее.
Укажите как с вами можно связаться? *
Любое из: Email, skype, телефон, vk, facebook, linkedin, МойКруг
ru.linkedin.com/in/seyfer/
http://brainstorage.me/seyfer
Форма создана в домене ООО “Лингуалео”.