[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/<имя_функции>

ex: http://php.net/preg_match

5. Что означает аббревиатура SOLID?

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