Я в сетях:

Облако тегов


Собеседование на должность php-разработчика. Часть 1. PHP Basics

Собеседование на должность php-разработчика. Часть 1. PHP Basics

Вернуться на главную

by root posted 03.08.2016 493

Раздел: Теория и практика PHP Теги: php, собеседование

Начнем с самого начала. Во всех моих собеседованиях в первою очередь следовали вопросы по теории php, иногда вскольз, иногда до низкоуровневых вещей. В данном посте пробежимся по теории начального и среднего уровней.

1. Типы данных в php

Типы данных более-менее подробно рассматривались в предыдущей статье, сейчас же чуть-чуть еще углубимся.

 

В php 8 типов данных: 

  • 4 скалярных типа: boolean, integer, float, string

  • 2 смешанных типа: array и object

  • 2 специальных типа: resource и null

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

 

Варианты принудительного приведения типов в php

(int), (integer) - приведение к integer
(bool), (boolean) - приведение к boolean
(float), (double), (real) - приведение к float
(string) - приведение к string
(array) - приведение к array
(object) - приведение к object
(unset) - приведение к NULL (PHP 5)
(binary) - приведение строковых литералов и переменных к бинарным строкам (с PHP 5.2.1)
 
Также существуют функции для преобразования типов:
intval() - в int
strval() - в string
settype ( mixed &$var , string $type ) - из одного типа в другой
 

2. Значения переменных по умолчанию

Если перенной до использования не было присвоено значение, то используется значение по умолчанию. Рассмотрим поведение инициализации для разных типов.

Тип переменной Значение по умолчанию
boolean false
integer 0
float 0
string пустая строка
array пустой массив
stdClass пустой объект класса stdClass

 

 

 

 

 

 

 

3. Резкий поворот в манере изложения материала

Способ изложения материала выше показался мне очень скучным и оторванным от реальности. Давайте пройдемся по реальным вопросам из тестов и собеседований, которые любят задавать гуру разработки и тимлидства. Далее буду предоставлять вопрос и ниже пытаться на него ответить. Если вы знаете ответ лучше, пожалуйста, напишите его в комментарии к статье или пришлите на tetraset[dog]ya.ru с темой "tetraset blog: собеседования".

4. Что выведет следующий код?

$word = 'zzz';
$word++;
echo $word;

Из документации php:

PHP следует соглашениям Perl (в отличие от С) касательно выполнения арифметических операций с символьными переменными. Например, в PHP и Perl $a = 'Z'; $a++; присвоит $a значение 'AA', в то время как в C a = 'Z'; a++; присвоит a значение '[' (ASCII значение 'Z'равно 90, а ASCII значение '[' равно 91). Следует учесть, что к символьным переменным можно применять операцию инкремента, в то время как операцию декремента применять нельзя, кроме того, поддерживаются только алфавит ASCII и цифры (a-z, A-Z и 0-9). Попытка инкремента/декремента других символьных переменных не будет иметь никакого эффекта, исходная строка останется неизменной.

Таким образом в нашем случае будет выведено "aaaa".

5. Что выведет следующий код?

$array = array(
1, 2, 'tom', '7jerry', 010, '020'
);
$callback = function ($a, $b) {
return $a + intval($b);
};
echo array_reduce($array, $callback, 1);

Ответ: 39. Разберем по итерациям:

1) Из документации

array_reduce ( array $array , callable $callback [, mixed $initial = NULL ] )

array_reduce() итеративно применяет callback-функцию callback к элементам массива array и, таким образом, сводит массив к единственному значению.

Таким образом первая итерация вернет 1 ($initial) + intval(1) = 2;

2) 2 + intval(2) = 4;

3) 4 + intval('tom') = 4  - если строка не начинается с числа при приведении типов, то она приводится к 0;

4) 4 +intval('7jerry') = 11 - в начале строки есть число 7, значит оно и будет при приведении типов к int;

8) 11 + intval(010) = 19 - данное выражение очень интересно, так как если число начинается с 0 при попадании в intval, то оно рассматривается как восьмиричное, если с 0x - то как шестнадцетяричное. 010 в десятичной системе равно 8;

9) 19 + intval('020') = 39 - '020' приводится к 20.

В данном задании нас подлавливали как могли.

6. Что выведет следующий код?

$k = 4;
$k = ++$k % 3;
$k += $k++ % 3;
echo $k;

Ответ: 5.

$k = ++$k % 3 - сначала преинкремент даст 5, затем получаем остаток от деления 5 % 3 = 2.

$k += $k++ % 3; остаток от деления 2 % 3 = 2; затем делаем постикремент $k++ = 3 и в конце 3 + 2 ($k += 2) = 5.

7. Что выведет следующий код?

$a = 1;
function test() {
echo "a = $a";
}
test();

Ответ: будет ошибка (Notice) о том, что переменная $a не определена.

Дело в том, что в нашем случае переменная $a находится в глобальной области видимости. Получить доступ к ней можно двумя способами.

1 способ

$a = 1;
function test() {
global $a;
echo "a = $a";
}
test();

2 способ

$a = 1;
function test() {
$a = $GLOBALS['a'];
echo "a = $a";
}
test();

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

$a = 1;
function test($a) {
echo "a = $a";
}
test($a);

8. Что выведет следующий код?

switch ("php") {
default:
echo "default";
case 0:
echo "0";
case "php":
echo "php";
}

Ответ: 0php

В данном примере нужно помнить про особенности работы с оператором switch. Цитата из доков:

Оператор switch исполняет строчка за строчкой (на самом деле выражение за выражением). В начале никакой код не исполняется. Только в случае нахождения оператора case, значение которого совпадает со значением выражения в операторе switch, PHP начинает исполнять операторы. PHP продолжает исполнять операторы до конца блока switch либо до тех пор, пока не встретит оператор break. Если вы не напишете оператор break в конце секции case, PHP будет продолжать исполнять команды следующей секции case.

В нашем случае операторов break и continue нет в теле case, таким образом PHP будет идти до конца после совпадения со значением в условии.

Вторая особенность состоит в том, что для сравнения с условием в case принятое значение PHP приводится к сравниваемому типу, то есть проиходит неточное сравнение (==). При case 0 значение "php" приводится к числу, в итоге получается 0 == 0 (intval("php")), что true, а далее код исполняется до конца, так как нет операторов прерывания.

9. Что выведет следующий код?

$a = array(
null => 'a',
true => 'b',
false => 'c',
0 => 'd',
1 => 'e',
'' => 'f'
);
echo count($a);

Ответ: 3

В данном вопросе нужно знать как PHP преобразует ключи массива. Цитата из доков:

Дополнительно с ключом key будут сделаны следующие преобразования:

  • Строки, содержащие целое число будут преобразованы к типу integer. Например, ключ со значением "8" будет в действительности сохранен со значением 8. С другой стороны, значение "08" не будет преобразовано, так как оно не является корректным десятичным целым.
  • Числа с плавающей точкой (тип float) также будут преобразованы к типу integer, т.е. дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8.
  • Тип bool также преобразовываются к типу integer. Например, ключ со значением true будет сохранен со значением 1 и ключ со значением false будет сохранен со значением 0.
  • Тип null будет преобразован к пустой строке. Например, ключ со значением null будет в действительности сохранен со значением"".
  • Массивы (тип array) и объекты (тип objectне могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type).

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

Таким образом, в конце всех преобразований мы получим следующий массив:

$a = array(
0 => 'd',
1 => 'e',
'' => 'f'
);

Как видно из кода его размер теперь равен трем.

10. Что выведет следующий код?

class HTTPException extends Exception {}
try {
throw new HTTPException('Oops!');
} catch (HTTPException $e) {
echo "Caught HTTPException\n";
} catch (Exception $e) {
echo "Caught Exception\n";
}

Ответ: Caught HTTPException

Обращаемся к доке:

При генерации исключения код следующий после описываемого выражения исполнен не будет, а PHP предпримет попытку найти первый блок catch, перехватывающий исключение данного класса.

Таким образом PHP постарается найти первый подходящий catch, в нашем случае с HTTPException.

Для первой части серии постов материала хватит, а пока продолжение следует...

 

 

Источник вопросов

comments powered by Disqus