[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. Это акроним, собранный из нескольких аббревиатур, которые относятся к объектно-ориентированному дизайну в программировании. Более подробно про каждый из них можно найти на просторах интернета. Достаточно интересный подход, советую всем хотя бы ознакомиться поверхностно.