In Linux we trust!

PHP hints & tricks

Серия быстрых рецептов, трюков и хаков для PHP...

1) isset на ключах массива

Функция isset() возвращает false на ключе массива со значением null.

$array = ['test' => null];
$bool = isset($array['test']);
// $bool => false
2) Тернарный оператор и его порядок

У тернарного оператора в PHP специфический порядок выполнения.

echo true ? 1 : true ? 2 : true ? 3 : true ? 4 : 5;
// Выведет 4, а не 1
3) filesize и его кэш

У многих функций для работы с файлами в PHP есть свой кэш. Например, у filesize(). Очищайте кэш, если вам важно отслеживать файлы.

$size = filesize($file);
file_put_contents($file, $data);
// Очистить кэш filesize
clearstatcache();
// Новый размер файла
$size = filesize($file);
4) Приведение типов

'0' к bool:

$a = (bool) '0';
// $a => false

false к array:

$b = (array) false;
// $b => [0 => false]

Нестрогое ставнение строки и числа:

$c = '0$' == 0;
// $c => true
5) break / continue

PHP позволяет указывать оператору break уровень вложенности, из которого мы хотим выбраться.

$i = 0;
while (++$i) {
    switch ($i) {
        case 5:
            echo "Итерация 5\n";
            // Выйти только из конструкции switch
            break;
        case 10:
            echo "Итерация 10\n";
            // Выйти только из конструкции switch и из цикла while
            break 2;
        default:
            break;
    }
}
6) Функция может возвращать ссылку
function & ref() {
    static $ref = [];
    return $ref;
}
$ref = & ref();
$ref[] = 'hello';

Ключевое слово static перед переменной в функции говорит о том, что переменная определена глобально, но имеет локальную область видимости. Чтобы получить доступ к переменной извне функция может вернуть ссылку. Ссылку можно вернуть из функции только на глобально-определенные переменные (например, на переменную класса).

7) Отладка по-живому

Для отладки на боевом сервере можно использовать заголовки:

$debug = print_r($something, true);
$debugInfo = preg_replace('~\s+~', ' ', $debug);
header("X-Debug: {$debugInfo}");
8) do-while

У этого цикла имеется короткий синтаксис:

do $isValid = doSomething($input); while ($isValid);

do-while позволяет использовать break внутри if:

// Блок выполнится 1 раз
do {
    // Какой-то код...
    // Выйти из блока?
    if ($abort) {
        break;
    }
    // Продолжаем выполнение блока...
} while (false);
9) glob

Отличная функция для перебора файлов по маске:

// Удалим все временные файлы
foreach (glob('*.tmp') as $tmp) {
    unlink($tmp);
}
10) $http_response_header

Оказывается file_get_contents пишет заголовки в переменную $http_response_header:

file_get_contents('http://google.com');
print_r($http_response_header);
Array
(
    [0] => HTTP/1.0 301 Moved Permanently
    [1] => Location: http://www.google.com/
    [2] => Content-Type: text/html; charset=UTF-8
    [3] => Cache-Control: public, max-age=2592000
    [4] => Server: gws
    [5] => Content-Length: 219
    [6] => HTTP/1.0 200 OK
    [7] => Expires: -1
    [8] => Cache-Control: private, max-age=0
    [9] => Content-Type: text/html; charset=ISO-8859-1
    [10] => Server: gws
    [11] => Accept-Ranges: none
    [12] => Vary: Accept-Encoding
)