Содержание

Вопросы и ответы на собеседованиях PHP программистов. Часть 2 — Блог Виктора Зинченко

1. Чем отличается аутентификация от авторизации?

Аутентификация (authentication) — процедура проверки подлинности.

Например: проверка подлинности пользователя путем сравнения введенного пароля с паролем в базе данных.

Авторизация (authorization) — предоставление и проверка прав пользователя на выполнение определенных действий.

Как это происходит, например, на сайте? После ввода логина и пароля пользователь проходит процедуру аутентификации, т.е. проверку введенных данных с данными, которые он оставил при регистрации.

При переходе, например, в административную часть сайта (админку) система проверяет наличие прав доступа у текущего пользователя (например, это может быть роль “admin”).


2. Что такое интерфейс и абстрактный класс? Зачем они нужны?

По сути, абстрактные классы и интерфейсы — это чертежи.

Интерфейсы могут содержать только абстрактные методы.

Абстрактный метод — метод класса, реализация для которого отсутствует.

В абстрактном классе можно объявлять и использовать переменные и методы (не только абстрактные).

Объект создать ни от абстрактного класса, ни от интерфейса не получится, их можно только наследовать. Для наследования абстрактного класса используется ключевое слово extends, для наследования интерфейса используется ключевое слово implements. Дочерний класс напрямую может наследовать только один класс (не важно, абстрактный или нет), интерфейсов может наследовать несколько (implements Interface1, Interface2, Interface3, ….). Абстрактные методы обязательно должны быть переопределены в наследующем классе (если только он не является абстрактным в свою очередь).

Зачем?

Интерфейсы позволяют гарантировать, что какой-либо используемый объект (класс) реализует необходимый набор методов. Например: если разработчиков несколько, то для того, что б контролировать код, который еще не написан (и будет написан разными людьми) создается интерфейс с перечнем функций, которые должен реализовывать класс, их названиями, параметрами и возвращаемыми значениями.

В абстрактном классе реализуют методы общие для потомков. К примеру: для экземпляров классов Triangle и Rectangle (унаследованных от абстрактного класса Figure, содержащего реализацию универсального метода draw) мы можем применять метод draw не задумываясь о его реализации, т.к. он реализован в родительском классе Figure.


3. Нормализация в БД.

Нормализация БД — сложная и обширная тема. Вряд ли я смогу обойтись несколькими абзацами и хорошо это объяснить. Потому, просто оставлю это здесь: ссылка 1, ссылка 2.


4. Что такое магические методы в PHP?

Любой встроенный метод в php, который начинается с __ называется магическим. Их особенность состоит в том, что они могут вызываться при совершении какого-то действия автоматически и без ведома программиста.

Это методы:

__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(),__invoke(), __set_state(), __clone(), __debugInfo()

Лучше всего о них написано в официальном руководстве.

 

5. Какие паттерны проектирования знаете?

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

К счастью, я наткнулся на эту статью. Здесь есть небольшая шпаргалка по паттернам (в конце статьи есть pdf документ). Рекомендую к ознакомлению!

http://habrahabr.ru/post/210288/

 

6. Какие методы http Вы знаете?

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

Но предупреждаю: не вдавайтесь в крайности — не стоит зубрить все до каждой буквы наизусть, ведь вещи, которые мы применяем редко, забываются. Вас поймут на собеседовании, если Вы не будете знать всех мелочей, но понимать основные принципы работы.
Очень часто бывает, что кандидат обладает достаточными знаниями для работы, но не может правильно сформулировать ответы на вопросы на собеседовании. Именно по-этому я всегда уделяю должное внимание теоретической подготовке в курсе PHP Start.

P.S. Если я где-то допустил неточность — пишите в комментарии, спасибо!

Поделитесь с друзьями или сохраните себе

Почему в PHP есть абстрактные классы, если вы можете использовать интерфейс и черты?

Я думаю, что есть философское различие в том, как и когда их использовать.

Вы сказали:

  1. абстрактные классы: «все, что использует меня, будет использовать эти методы и атрибуты»
  2. интерфейсы: «все, что использует меня, должно иметь эти методы и атрибуты»
  3. черты: «все, что использует меня , также будет иметь эти методы и атрибуты».

Если вы сосредоточены на своих собственных формулировках, это имеет смысл.

Абстрактные классы в действительности определяют абстрактные вещи, например, «Транспортное средство» является абстрактным до тех пор, пока оно не

материализуется в форме автомобиля или велосипеда. Ни интерфейс не определяет это, ни черты.

Интерфейсы дополняют функциональность наследования классов, когда класс наследуется от нескольких классов (только некоторые языки обеспечивают множественное наследование, например C/C++). Интерфейсы, как следует из названий, ориентированы на ИНТЕРФЕЙС, а не на реализацию метода интерфейса в классе, который его реализует. Это делает классы PLUG & PLAYABLE, поэтому каждый должен следовать стандарту. Если вы в дальнейшем прочитаете о заводских и адаптерных шаблонах на ООП, вы поймете это.

Черты имеют реализацию / функциональность, которая не привязана к конкретным классам. Вместо этого ее можно найти в разных классах. Это как ген в генетике, который остается немым у родителей и появляется только у определенных детей. Или быть кратким

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

Edit Interface + Trait! = Abstract Class, потому что при использовании наследования selective как вы выбираете конкретную черту для использования и при использовании Abstract Class наследование является обязательным или продиктовано родительским классом, у вас нет свободы!

PHP в именовании про абстрактные классы и интерфейсы

должен ли абстрактный класс всегда иметь префикс Abstract и далее Interface (когда это интерфейс)? Существует ли стандартное соглашение об именах, подобное PSR-0 для структуры папок / пространств имен, но для классов?

5 ответов


для этого нет соглашения; особенно в PHP. Все это может быть организовано так, как вы хотите.

с дополнениями от пространства имен в PHP 5.3, я не вижу необходимости добавлять Abstract или Interface префиксы/суффиксы для названия класса.

просто назовите вещи, как они есть!


хотя нет никакого соглашения, я думаю, что это хорошая практика использования Abstract префикс и Interface суффикс для соответствующих компонентов. Это помогает лучше понять код с первого взгляда, ИМО.


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

из моего опыта я бы предложил следующее: «проектирование по контракту «. Назовите свои контракты (интерфейсы), как вы назвали бы свой класс реализации, а затем дайте своей реализации более конкретное имя (или резервный вариант MyContractNameImpl, известный в основном из Java, я думаю). Кроме того, многие современные IDE знают, является ли ваш класс интерфейсом или абстрактным, поэтому нет необходимости помещать это в его имя. Я также нахожу контракты с именем «IMyContract » не очень хорошими по тем же причинам.