Вопросы и ответы с собеседований по PHP
Вопросы и ответы с собеседований PHP-разработчиков. Типы данных в PHP, особенности синтаксиса, передача данных по ссылке, реализация парадигмы ООП, предназначение кавычек, устройство сортировки и сборки мусора, генераторы, трейты и многое другое.
Какие типы данных есть в PHP?
Хотя PHP это динамический язык, все же все данные в нем имеют четкие типы.
Скалярные типы:
- bool
- int
- float
(иногда встречается название double
что для php не имеет разницы)
- string
Смешанные типы:
- array
- object
- callable
- iterable
Специальные типы:
- resource
- null
Обязательно ли писать ?> в конце скрипта?
Для файлов, содержащих только PHP-код, закрывающий тег ?>
лучше не использовать. Он не требуется синтаксисом PHP и его пропуск предотвращает случайное включение в вывод конечных пробелов.
В чём разница между === и ==?
1 === 1: true
1 == 1: true
1 === "1": false
1 == "1": true
"foo" === "foo": true
Оператор ==
производит приведение операндов к одному типу перед сравнением.
Оператор ===
сравнивает операнды без приведения типов, как есть.
Что такое ссылка в PHP?
Ссылки в PHP - это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели в C - например, вы не можете выполнять над ними адресную арифметику, они не являются реальными адресами в памяти и т.д. Вместо этого указатели в PHP - это псевдонимы в таблице имён переменных.
Как передать переменную по ссылке?
function foo(&$var)
{
$var++;
}
$a = 5;
foo($a);
// $a здесь равно 6
Вы можете передать переменную по ссылке в качестве аргумента в функцию, чтобы эта функция могла изменять значение переменной.
Замечание: В вызове функции отсутствует знак ссылки - он есть только в определении функции. Этого достаточно для корректной передачи аргументов по ссылке.
По ссылке можно передавать:
- Переменные, например
foo($a)
- Ссылки, возвращаемые функцией, например:
function foo(&$var)
{
$var++;
}
function &bar()
{
$a = 5;
return $a;
}
foo(bar());
Для чего нужен ini__set()?
PHP позволяет изменять некоторые из настроек, приведенных в php.ini
, с помощью ini_set()
.
ini__set()
принимает два аргумента: первый — это имя параметра, который нужно изменить, а второй — его новое значение.
Данный код активирует настройку display_error
:
ini_set('display_errors', '1');
Нужно поместить приведенный выше код в начало скрипта, чтобы параметр оставался включенным до конца. Кроме того, значения, установленные через ini_set()
, применимы только к текущему скрипту.
Что такое интерфейс в PHP?
Интерфейс в PHP — это конструкция языка, описывающая абстрактный тип данных (АТД). АТД определяет набор операций (функций), независимых от конкретной реализации типа для манипулирования его значениями. На практике интерфейсы содержат определения функций (то есть описание их сигнатур) без их реализации.
Что такое абстрактный класс?
Абстрактный класс - это так называемый базовый класс, не предназначенный для создания его экземпляров (объектов). Основной смысл и назначение абстрактных классов заключается в расширении возможностей его дочерних классов.
Поддерживает ли PHP множественное наследование?
Нет, PHP не поддерживает множественное наследование. То есть у производного класса может быть только один родительский. Но с помощью “магической” функции __call()
его можно эмулировать.
Какие есть модификаторы доступа в PHP?
С помощью специальных модификаторов можно задать область видимости для свойств и методов класса. В PHP есть три таких модификатора:
public
: свойство, метод или конструктор будут доступны для всех классов, которые их используют.
protected
: может быть использован только в самом классе, а также в его дочерних.
private
: может быть использован только в самом классе и нигде больше.
Зачем нужен «static» в PHP?
1. Для объявления статической локальной переменной. 2. Для объявления статического свойства или метода класса. 3. Для реализации позднего статического связывания.
Что такое позднее статическое связывание?
PHP реализует функцию, называемую позднее статическое связывание, которая может быть использована для того, чтобы получить ссылку на де-факто вызываемый класс в контексте статического наследования.
Что такое PDO?
PDO (PHP Data Objects) — расширение PHP, которое реализует взаимодействие с базами данных при помощи объектов. Профит в том, что отсутствует привязка к конкретной системе управления базами данных. Предоставляемый интерфейс поддерживает, среди прочих, такие популярные СУБД: - MySQL; - SQLite; - PostgreSQL; - Microsoft SQL Server.
Разница между isset() и empty()?
isset()
— проверяет переменную на существование, а также, что её значение не null
. Если переменная существует и её значение не null
, то функция вернёт true
, все остальные случаи — это false
.
empty()
— проверяет переменную на существование и на пустоту. Если в переменной есть какое-то не пустое значение (в том числе null
) или true
, то функция вернёт false
, все остальные случаи — это true
.
Разница между require и include?
Языковая конструкция include
включает и выполняет указанный файл. Если подключаемый файл не найден, то мы увидим ошибку уровня Warning(предупреждение) и скрипт спокойно продолжит своё выполнение.
Конструкция require
похожа на include
- она включает и выполняет указанный файл, за исключением того, что при отсутствии файла произойдёт фатальная ошибка уровня E_COMPILE_ERROR
и работа скрипта остановится.
Зачем require и include приставка _once?
include_once "test.php";
require_once "test.php";
У вышеуказанных языковых конструкций есть так называемые близнецы: include_once
и require_once
.
При использовании именно этих конструкций PHP будет подключать файл только один раз. Если в подключаемом файле находятся декларации функций и/или классов, то имеет смысл подключать такой файл с помощью _once
, потому как попытка переопределения любой существующей функции приведёт к Fatal Error
.
Разница между одинарными и двойными кавычками?
$beer = ‘Chimay’;
echo “$beer”;
В двойных кавычках данные “парсятся”, а в одинарных – нет. Двойные кавычки в данном случае приведут к результату
Chimay
, а одинарные к $beer
.
Разница между self и $this?
self
используется для статических функций и членов класса, а $this
наоборот для нестатических.
$this
- это ссылка на текущий объект и она нужна, чтобы обратиться к переменной в контексте класса.
self
используется в том же ключе, но уже для статических свойств.
Что работает быстрее: преинкремент или постинкремент?
Преинкремент работает быстрее, изменяя содержимое самой переменной, в то время как постинкремент создает временную переменную.
Какой алгоритм сортировки используется в PHP для таких функций, как sort и т. д.?
Используется introsort
.
В документации есть упоминание об использовании quicksort
, но тут нет противоречия, ведь introsort
— гибридный алгоритм сортировки, где при малом количестве элементов используется сортировка вставкой, а позже используется более быстрый алгоритм: quicksort
или heapsort
.
Какой алгоритм используется в PHP для сборки мусора?
Reference counting, tri-color marking
Что такое PSR?
PSR расшифровывается как PHP Standards Recommendations, что переводится как «Рекомендованные стандарты PHP». Эти стандарты создаются и поддерживаются сообществом опытных PHP-программистов со следующей целью: нужно писать код на языке PHP в одном стиле так, чтобы его без проблем могли читать другие программисты. Иными словами, это такой набор правил, следуя которым, код становится более понятным и единообразным, когда над ним работают несколько людей.
Какая разница между echo и print?
Во-первых, echo
может принимать и выводить любое количество аргументов, а print
- только один.
Во-вторых, print
всегда возвращает 1
, поэтому может быть использован в контексте выражения.
Что такое магические методы?
Магические методы - это специальные методы, которые переопределяют действие PHP по умолчанию, когда над объектом выполняются определённые действия.
Следующие методы считаются магическими: __construct()
, __destruct()
, __call()
, __callStatic()
, __get()
, __set()
, __isset()
, __unset()
, __sleep()
, __wakeup()
, __serialize()
, __unserialize()
, __toString()
, __invoke()
, __set_state()
, __clone()
и __debugInfo()
.
Например, метод __toString()
позволяет классу решать, как он должен реагировать при преобразовании в строку. Конкретный случай: что вывести при выполнении echo $obj
.
Что такое генераторы?
Генератор позволяет писать код, использующий foreach
для итерирования набора данных, без необходимости создания массива в памяти, что может привести к превышению лимита памяти, либо потребует довольно много времени для его создания.
Вместо этого, можно написать функцию-генератор, которая, по сути, является обычной функцией, за исключением того, что вместо возврата единственного значения, генератор может выполнять возврат (yield
) столько раз, сколько необходимо для генерации значений, позволяющих перебрать исходный набор данных.
Что такое трейты?
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
Трейт - это механизм обеспечения повторного использования кода в языках с поддержкой только одиночного наследования, таких как PHP.
Трейт предназначен для уменьшения некоторых ограничений одиночного наследования, позволяя разработчику повторно использовать наборы методов свободно, в нескольких независимых классах и реализованных с использованием разных архитектур построения классов.
Что такое пространства имён?
namespace MyProject {
function run()
{
echo 'Running from a namespace!';
}
}
В широком смысле - это один из способов инкапсуляции элементов.
Такое абстрактное понятие можно увидеть во многих местах. Например, в любой операционной системе директории служат для группировки связанных файлов и выступают в качестве пространства имён для находящихся в них файлов.
Замечание: Имена пространств имён регистронезависимы.
Что такое сессии?
Поддержка сессий в PHP заключается в способе сохранения некоторых данных между несколькими последовательными доступами.
Каждому посетителю сайта присваивается уникальный идентификатор, называемый идентификатором сессии (session id
). Он хранится либо в cookie на стороне пользователя, либо передаётся через URL.
Поддержка сессий позволяет сохранять данные между запросами в суперглобальном массиве $_SESSION
. В тот момент, когда посетитель получает доступ к сайту, PHP проверяет автоматически (если session.auto_start
установлено в 1) или по запросу (явным образом через вызов session_start()
), был ли определённый идентификатор сессии послан вместе с запросом. Если это так, восстанавливается сохранённое ранее окружение.
Что такое суперглобальные переменные?
Суперглобальные переменные — встроенные переменные, которые всегда доступны во всех областях
Некоторые предопределённые переменные в PHP являются "суперглобальными", что означает, что они доступны в любом месте скрипта. Нет необходимости использовать синтаксис global $variable;
для доступа к ним в функциях и методах.
Суперглобальными переменными являются:
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
Что такое $GLOBALS?
Ассоциативный массив (array
), содержащий ссылки на все переменные, определённые в данный момент в глобальной области видимости скрипта. Имена переменных являются ключами массива.
Что такое замыкания?
$greet = function($name) {
printf("Привет, %s\r\n", $name);
};
$greet('Мир');
$greet('PHP');
Анонимные функции, также известные как замыкания (closures), позволяют создавать функции, не имеющие определённых имён.
Замыкания могут быть использованы в качестве значений переменных; PHP автоматически преобразует такие выражения в экземпляры внутреннего класса
Closure
.
Замыкания могут наследовать переменные из родительской области видимости. Любая подобная переменная должна быть объявлена в конструкции use
. Начиная с PHP 7.1, эти переменные не должны включать superglobals
, $this
и переменные с теми же именами, что и параметры функции. Объявление типа возвращаемого значения функции должно быть помещено после конструкции use
.