[PHP]: Вопросы на собеседовании #3
Продолжаю цикл статей про вопросы, которые встречались мне на собеседованиях. Поехали:
1. Какова алгоритмическая сложность операции strlen
?
Вопрос интересный, чтобы ответить на него надо знать особенности выделения памяти и хранения массивов в PHP. Пытаясь решить задачку в лоб, можно получить ответ O(N)
, где N
— кол-во элементов. Насколько я знаю, strlen
возвращает количество байт занятых строкой, поэтому на юникодных кодировках возникают проблемы. Эта цифра хранится в первых четырех байтах памяти выделенной под переменную, поэтому функцию просто берет значение оттуда и возвращает, следовательно вся алгоритмическая сложность сводится к O(1)
.
2. Приведите пример позднего статического связывания
Если человек знает что это такое, то особо труда сделать не составит. Технология достаточно полезная, но со статикой лучше не борщить. Приведу простенький пример, с использованием слова static
:
abstract class DocumentType
{
public static function create()
{
return new static();
}
}
class Doc extends DocumentType {}
class Ppt extends DocumentType {}
var_dump(Doc::create());
Выведет:
Doc Object
Показывает, что static
в отличие от self
относится к тому классу откуда вызывается метод, а не к тому, в котором данный метод содержится.
3. Что такое "магические" методы в PHP?
Вообще в англоязычной литературе эти методы называют interceptors (дословно перехватчики). Всего их 5:
__get( $property )
— вызывается при обращение к неопределенному свойству__set( $property, $value )
— вызывается при попытки присвоить значение неопределенному свойству__isset( $property )
— вызывается при попытке проверить существование неопределенного свойства__unset( $property )
— вызывается при попытке освободить память неопределенного свойтсва__call( $method, $args )
— вызывается при попытке вызвать неопределенный метод
Подробнее расписывать не буду, лучше отправлю в мануал. Там указываются еще несколько магических методов: __construct()
, __desctruct()
, __callStatic()
, __sleep()
, __wakeup()
, __toString()
, __clone()
, __invoke()
.
В документации более подробно написано когда тот или иной метод вызывается и используется.
4. Как быстрее всего найти мануал по функции PHP
?
С одной стороны ответ или отсутствие такового не позволит узнать силу разработчика. С другой стороны, те, кто используют язык каждый день, когда им надо уточнить какой-то нюанс не будут набирать в google sort
или preg_match
. Потому что программисты любят использовать всякие крутые плюшки, для ускорения всего, что только можно ускорить. Самый простой и быстрый способ найти документацию по методу это набрать следующее:
http://php.net/<имя_функции>
5. Что означает аббревиатура SOLID?
Проще всего информацию о том, что эта аббревиатура значит найти в Wikipedia. Это акроним, собранный из нескольких аббревиатур, которые относятся к объектно-ориентированному дизайну в программировании. Более подробно про каждый из них можно найти на просторах интернета. Достаточно интересный подход, советую всем хотя бы ознакомиться поверхностно.