Подготовка к Zend сертификации по PHP

Теги PHP

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

<?php
... code
?>

Тем не менее в начале страницы может присутствовать только один открывающий тег <?php. Короткие теги возможно отключить (как правило из-за совместимости с XML) установив директиву short_open_tagв файле php.ini:

<?
... code
?>

Следующий вариант полностью заменяет <? echo, даже если короткие теги отключены:

<?= $variable; ?>

Теги script гарантированно всегда работают, так же как и стандартные теги:

<script language="php">
... code
</script>

ASP теги — включаются отдельно при помощи директивы asp_tags:

<%
// ... code
%>
<%= $variable; %>

Если файл содержит исключительно PHP код, то предпочтительнее не прописывать закрывающий тег в конце файла. Таким образом вы избегаете появления излишних пробелов и пустых строк после закрывающего тега (например header() должен обязательно находится в начале вывода). Закрывающий тег блока PHP кода автоматически подразумевает наличие точки с запятой. То есть в конце последней строки кода совсем необязательно ставить точку с запятой. Следующий пример полностью работоспособен:

<?php
echo 'hello' // символ ; не обязательно
?>

Файлу PHP не требуются права на исполнение.

Комментарии

Однострочный комментарий заканчивается с окончанием строки или PHP блока (или \r, \n, \r\n), то есть с тем, что встретится первым. Таким образом HTML код после // … ?> или # … ?> будет выведен на печать. ?> заканчивает обработку PHP и включает HTML режим, и символы // и # не препятствуют этому. При включенной директиве asp_tags ситуация полностью идентична с // %> и # %>. Но тег </script> не прерывает обработку PHP кода в однострочном комментарии.

<?php
// Это однострочный комментарий
# Это однострочный комментарий
# Комментарий на новой строке ?> А это часть текста уже будет выведена.

Многострочный комментарий оканчивается при первой встрече символов */. Многострочные комментарии не поддерживают вложенность. Такая ошибка часто встречается при комментировании больших участков кода.

<?php
/*
This is a multi-line
comment
*/
/* this is also
commented */ but this don't */
?>

Ниже приведен пример DocComment. Сам PHP воспринимает этот участок как простой комментарий. Для дополнительной информации обратитесь к сайту phpDocumentor.

<?php
/**
* API Documentation Example
*
* @param string $bar
*/
function foo($bar) { }
?>

Выражения

По сути, почти все, что вы пишите в PHP является выражением (то есть значения, функции и т.д.). Наверное самый простой способ описать выражения — это все, что имеет значение в коде.

Выражение имеет форму выражение ;, то есть каждое выражение закрывает точка с запятой. В $b = $a = 5;, $a = 5 является верным выражением, но не является инструкцией. $b = $a = 5; — верная инструкция.

Заметка: присваивание выполняется с права налево, следующий вариант полностью идентичен $b = $a = 5;.

Операторы

Оператор принимает одно или несколько значений (выражений) и возвращает другое значение (в итоге мы получаем выражение). Операторы группируются в зависимости от количества значений, которое они принимают.

Унарные операторы принимают только одно значение, например ! (операция логического отрицания) или ++ (оператор инкрементирования). Бинарные операторы принимают два значения. Примером бинарных операторов служат математические операторы (+, -), отметим что под эту категорию попадает большинство операторов PHP. Также существует лишь один тернарный оператор — ? :, который принимает три значения. Хотя этот оператор часто называют тернарным, по сути это оператор условия.

Приоритет и очередность операторов

Приоритет операторов указывает на то, как сильно он «связывает два выражения». Например, результатом выражения 1 + 5 * 3 будет 16, а не 18, так как операция умножения имеет больший приоритет по сравнению со сложением. Для указания нужного приоритета часто применяются круглые скобки. Например (1+5) * 3 = 18.

При работе с операторами равного приоритета, их очередность определяет порядок вычисления (справа налево или слева направо). Очередность оператора может быть левой (оператор вычисляется слева направо) или правой (справа налево) либо нулевой (используется при несвязанных между собой операций).

Большинство операторов в PHP имеют левую или нулевую очередность, за исключением ! ++ — ~ (int) (float) @ = += -= *= /= .= %= &= |= ˆ= <<= >>=, который имеют правую очередность.

Выражение 1 < 2 > 1 не является корректным (так как операторы имеют один и тот же приоритет и очередность), а 1 <= 1 == 1 уже корректно.

<?php
$a = 3 * 3 % 5;   // (3 * 3) % 5 = 4
$a = true ? 0 : true ? 1 : 2;   // (true ? 0 : true) ? 1 : 2 = 2

Арифметические операторы

Тут большой разницы с реальном миром нет.

<?php
echo 2 + 2; // Addition. Will print 4
echo 3 - 2; // Subtraction. will print 1
echo 1 * 2; // Multiplication. Will print 2
echo 4 / 2; // Division . Will print 2
echo -2; // Negation. Will print -2
echo 3 % -2 // Modulus. Will print 1
echo -3 % 2 // Modulus. Will print -1
echo 0x8A + 3 // Will print 141 (0x8A = 8x16 + 10 = 138), note always returns the decimal values
?>

Оператор деления / всегда возвращает float за исключением случая когда оба операнда целочисленного типа (или строка преобразованная в integer) либо операнды делятся без остатка. Деление на ноль вызывает предупреждение типа: Division by Zero.

Операнды модульного деления преобразуются в integer (путем сокращения десятичной части) перед обработкой.

Результат модульного деления (%) имеет знак делимого — то есть результат операции $a % $b будет иметь такой же знак что и операнд $a, то есть (5 % -3) = 2; (-5 % 3) = -2.

Оператор Точка

<?php
$a = 1;
$a .= 2;
echo $a; // 12

Операторы присваивания

Основной оператор присваивания — это =. При его использовании левому операнду присваивается значение правого выражения. Левая часть должна быть переменной. Результат операции присваивания — присвоенное значение. Таким образом, значение $a в выражении $a = 3 равно 3, то есть $a = ($b = 4) + 5; // значение $a 9.

При работе с массивами, присваивание значения по ключу осуществляется при помощи оператора =>. Приоритет этого оператора идентичен другим операторам присваивания. В дополнение ко всем основным операторам присваивания, в PHP используются составные операторы для арифметических операций, операция соединения массивов и строк.

<?php
$a = 3;
$a += 5; // Equal 8
3 = $a; // output error

Обратите внимание, что PHP создает копию изначальной переменной (присваивание по значению), таким образом изменения не затрагивают второй операнд.

Присваивание по Ссылке

PHP также поддерживает присваивание значения по ссылке при использовании синтаксиса $var1 = &$var2. При таком подходе копия переменной не создается, обе переменные указывают на один адрес в памяти. Переменная будет указывать на адрес до тех пор, пока не будет удалена (unset). Обратите внимание, что ссылочные операции в PHP медленнее.

<?php
$a = 3;
$b = &$a; // or a space in-between & $a // $b is a reference to $a
$b = 50;print "$a\n"; // prints 50
print "$b\n"; // prints 50
?>

Начиная с PHP5, оператор new автоматически осуществляет ссылочное присваивание. Таким образом выражение $a = &new C вызовет появление сообщения E_DEPRECATED начиная с PHP версии 5.3 и выше.

Битовые операции

Битовые операции позволяют работать с битами в целочисленных данных. Целочисленные значение переводятся в равнозначное двоичное значение 5 -> 0101 = 0*8 + 1*4 + 0*2 + 1*1. Применяйте круглые скобки для назначения приоритета операциям. Например, $a & $b == true, сначала выполнится сравнение, а уже потом битовая операция. ($a & $b) == true, сначала исполнится битовая операция, а уже потом сравнение.

Всегда следите за конвертацией данных. Если оба параметра строки, то битовые оператор будет работать со значением символов ASCII.

  • $a & $b (И) — в результате получи установленные биты только те, которые установлены в обоих операндах.
  • $a | $b (ИЛИ) — Остаются биты, которые установлены или в $a, или в $b.
  • $a ^ $b (Xor (исключающее ИЛИ)) — остаются биты, установленные или в $a или в $b, но не в обоих.
  • ~ $a (НЕ) — отрицание.
  • >> (сдвиг вправо) – Все биты смещаются вправо на N порядков, крайние правые биты отбрасываются, а слева добавляются нули. Аналог деления на 2 без учета остатка.
  • << (сдвиг влево) – Все биты смещаются влево, биты высшего порядка отбрасываются, а младшие изменяются на ноль. Аналог умножения на 2.
  • Смещение в PHP — арифметическая операция. Биты смещенные за пределы разрядной сетки просто отбрасываются. При левом сдвиге нули добавляются справа, при правом — слева. Знаковый бит — бит самого старшего разряда в числе (0 — положительное число, 1 — отрицательное), отбрасывается при левом сдвиге, то есть знак числа не сохраняется при операциях сдвига. При правом сдвиге знаковый бит копируется и знак числа сохраняется.

Примером битовой операции может служить установка уровня отладки в PHP, то есть E_ALL & ~E_NOITCE(00000000000000000111011111111111 & 11111111111111111111111111110111 дает 00000000000000000111011111110111 количество бит определяется типом системы, в примере используется 32 битная система).

Операторы сравнения

Как уже понятно из названия, эти операторы используются для сравнения значений.

  • $a == $b (Equivalence) — TRUE если операнды равны после приведения типов.
  • $a === $b (Identity) — TRUE если операторы равны и они одного типа.
  • $a != $b $a <> $b (Non-equivalent) — TRUE если операторы не равны после приведения типов.
  • $a !== $b (Non-identical) — TRUE если операторы не равны или имеют разный тип
  • $a < $b (Less than) — TRUE если $a строго меньше $b
  • $a > $b (Greater than) — TRUE если $a строго больше $b.
  • $a <= $b (Less than or equal to) — TRUE если $a меньше или равно $b.
  • $a >= $b (Greater than or equal to) — TRUE если $a больше и равно $b.

При сравнение числа со строкой или строковые значения подразумевают числа в своем значении, то каждая строка приводится к численному значению, которые впоследствии сравниваются. Приведение типов не используется при работе с операторами === или !==.

Для различных типов сравнение работает немного по разному:

  • null со строкой — null приводится к "", то есть к пустой строке
  • bool или null с другими типами — значения приводятся к булеву значению
  • сравнение объектов — при использовании оператора ==, объекты сравниваются следующим образом — два объекта равны в том случае, если их поля имеют одинаковое значения и они являются экземплярами одного класса. При использовании оператора ===, объекты равны в том случае, если они указываются на одну область памяти.
  • строка, ресурс или число со строкой, ресурсом или числом — строки и ресурсы приводятся к численному значению.
  • массив с массивом — массив с меньшим числом элементов меньше, если ключ из первого массива не существуют во втором массиве, то они не сравниваются, в остальных случая массивы сравниваются по значениям элементов.
  • массив с любым типом — массив всегда больше.
  • объект с любым типом — объект всегда больше.

Внимание: (0 == “a”) true, (“1” == “01”) true.

Тернарный оператор

В PHP существует оператор сравнения ?: (тернарный оператор). В выражении типа (expr1) ? (expr2) : (expr3) выполняется expr2 если expr1 === true, а expr3 если expr1 === false. В PHP 5.3 и выше допускается пропуск expr2, в таком случае возвращается expr1 в случае если оно равно true и expr3 в противном случае.

Обратите внимание, что тернарный оператор это выражение, в результате которого вы получаете не переменную, а результат выражения. Это нужно помнить, когда вы планируете вернуть переменную по ссылке. Использование выражение $var == 42 ? $a : $b в качестве возвращаемого значения в функции вызовет предупреждение в позних версиях php.

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

<?php
print 0=='a1'? 'TRUE': 'FALSE'; or
0=='a1'? print 'TRUE': print 'FALSE';
but NOT 0=='a1'? echo 'TRUE': echo 'FALSE';

Операторы управления ошибками

Для подавления вывода ошибок используется оператор (@). Если вы используете track_errors, то все ошибки скрытые таким оператором будут сохранены в переменной $php_errormsg.

Операторы выполнения «

« — параметр оператора выполняется в качестве shell команды (аналог shell_exec()) с правами веб сервера. Этот оператор не работает при включенном безопасном режиме или отключенной функции shell_exec().

Операторы инкремента/декремента

Операторы ++ и -- используются для уменьшения или увеличения на единицу численного значения. При применении на символьном значении, изменяется значение символа ASCII. Операторы не оказывают влияния на булевы данные.

<?php
$a = 3;
echo $a++; // 3
$b = 3;
echo ++$b; // 4

Логические операторы

Для выполнения логических операций на булевых значениях используются (!, &&, ||, XOR)

Обратите внимание операторы || и && имеют больший приоритет, чем or и and. $e = false || true возвращает true, $e = false or true возвращает true, равнозначно ($e=false) or true;

Что же касается оператора and, если левое выражение возвращает FALSE, то FALSE возвращается сразу же без обработки правой части выражения. Таким образом if(isset($A)&&$A==2){ } не вызовет ошибку если переменная $A не задана.

Строковые операторы

Соединение двух или нескольких строк (.)

<?php
$a = 'Hello'; $b = ' World';
echo $a.$b; // Hello World 

Операторы для работы с массивами

  • $a + $b — (Объединение) — Соединение двух массивов $a и $b
  • $a == $b — (Равенство) — TRUE если пары ключей/значений обоих массивов равны
  • $a === $b — (Идентичность) — TRUE если пары ключей/значений обоих массивов равны, расположены в одном порядке и имеют один тип
  • $a != $b — (Неравенство) — TRUE если $a не равно $b
  • $a <> $b — (Неравенство) — TRUE если $a не равно $b
  • $a !== $b — (Не идентичность) — TRUE если $a не идентичен $b

Оператор + возвращает правый массив соединенный с левым. При совпадающих ключах будут использованы элементы левого массива, а элементы правостороннего массива будут проигнорированы.

Операторы типов

instanceof — возвращает true если переменная является указанным экземпляром указанного класса или интерфейса. Возвращает false если переменная не является объектом. Вызывает ошибку при обработке константы.

<?php
if ($obj instanceof A)

is_a(object, class_name) заменитель предыдущего оператора, проверяет если объект является экземпляром класса или один из его родителей является экземпляром указанного класса. Не является устаревшей функцией начиная с PHP версии 5.3.

Типы и переменные

Имена

  • могут состоять из букв, чисел и нижнего подчеркивания
  • должны начинаться с буквы или нижнего подчеркивания ($this не допускается)
  • имена переменных регистрозависимы (имена функций — нет)

Типы

  • Простые типы: булево значение, строки, целочисленные, числа с плавающей точкой
  • Составные типы: массив, объект
  • Специальные типы: ресурс, null, callable

Замечания

  • чтобы проверить тип переменной $a используйте следующие функции — var_dump($a), gettype($a), is_string($a)
  • приведение типов — (int), (integer), (bool), (boolean) и т.д. или settype($a, “bool”)
  • (string) $a или strval($a), или $object->_toSring для приведения переменной к строковому типу, обратите внимание (string)TRUE = “1”, (string)FALSE = “”
  • unset($a) или (unset) $a для приведения к null
  • Комплексный синтаксис: {$name} или ${name}, { $name} — не комплексный синтаксис
  • echo “This works: {$arr[‘key’]}“; // единственный способ использования значения массива по ключу при двойных кавычках
  • переменные всегда объявляются по значению, за исключением $new_variable = &$old_variable (ссылки допускаются только для переменных, функции передавать по ссылке нельзя).

Преобразование строки в число

<?php
$foo = "10.0 pigs " + 1; // $foo is float(11)
$foo = "pigs 10" + 1; // $foo is integer (1)

Строки

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

Каждый символ в строке представлен одним байтом. Строки хранятся в той кодировке, в которой написан файл скрипта. Сам PHP не имеет поддержки работы с мультибайтными наборами символов (Unicode). Для работы с ними вам понадобится установить разрешение mbstring.

Некоторые функции не работают с многобайтовыми строками — substr(), strlen(). Другие работают в пределах текущей локали (setlocale()) — ucfirst(), strtoupper().

Некоторые функции направлены на работу только с определенной кодировкой — utf8_encode(), utf8_decode().

Строки могут быть заданы одним из следующих способов:

  • 'some text' — строка сохраняется как есть, переменные и управляющие последовательности не обрабатываются (\n \r не будут обработаны)
  • "some text" — переменные и управляющие последовательности будут обработаны
  • <<< — обработка строки происходит таким же образом как и при двойных кавычках, но строка может быть расположена на нескольких строчках. Начиная с PHP 5.3 при помощи синтаксиса heredoc может задавать значение переменных, свойств, констант. Также открывающий символ heredoc может быть в двойных кавычках.
  • Nowdoc — аналог heredoc для одинарных кавычек. Обработка переменных и управляющий последовательностей не производится
<?php
$greeting = <<<"GREETING" // heredoc $name is parsed
She said "That is $name's" dog!
GREETING;
$greeting = <<<'GREETING' // nowdoc $name is NOT parsed
She said "That is $name's" dog!
GREETING

Целочисленные значения

Могут быть заданы в десятичном, шестнадцатеричном или восьмеричном формате со знаком. Для восьмеричного формата используйте 0 перед числом. Для шестнадцатеричного — , для двоичного — 0b.

Максимальное значение зависит от платформы, как правило, это примерно 2 миллиарда.

Замечание: var_dump(01090); // 010 восьмеричное значение = 8 десятичное, так как 9 отсутствует в восьмеричной системе исчисления.

Float (он же Double)

1.234, 1.2e3, 7E-10 (E и e равнозначны)

Максимальное значение зависит от системы, но, как правило, это ~1.8e308 с точностью до 14 знаков после запятой.

Из-за специфики хранения в памяти чисел с плавающей точкой, сравнивать их нельзя. [floor((0.1+0.7)*10) вернет 7].

1.2e3 есть float (вычисляется 1.2 x 10 x 10 x10)

Булево значение

  • Любое целочисленное значение кроме нуля приводится к true
  • Любое строковое значение, за исключением пустой строки и "0" приводится к true (то есть "000" — true)
  • TRUE и FALSE регистронезависимы, чаще всего используются заглавные буквы.

Массивы

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

Ключи приводятся к другим типам: float в integer, булевы значения в 1 (TRUE) или 0 (FALSE), NULL в “”(пустая строка).

Перечисляемыми массивами называются массивы, ключами которых являются integer, если ключи — строки, то такой массив называется ассоциативным.

Если вы не указываете ключ при добавлении элемента в массив, то PHP автоматически использует значение на один больше последнего добавленного целочисленного ключа, даже если этот элемент был удален.

$array[‘key’] и $array{‘key’} — равнозначны. Ключ должен быть указан в кавычках, иначе PHP примет его за константу. Если такой константы не будет обнаружено, то вы увидите E_NOTICE.

Это не будет работать: print «Hello $arr[‘fruit’]»; Нужно заменить на "Hello ".$arr['fruit']; или "Hello {$arr['fruit']}";.

$myArray = array(‘a’=>’aa’,’b’=>’bb’); тоже самое что и $myArray[‘a’] = ’aa'; $myArray[‘b’]=’bb';.

Используйте unset($myArray[‘key’]) или unset($myArray) для удаления массива.

Объекты

Объекты объединяют в себе данные и методы. Выражение new используется для создания новых объектов.

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

<?php
$obj = (object) 'name';
echo $obj->scalar;  // выведет 'name'

Ресурс

Специальный тип для обозначения ресурсов операционной системы, например, открытый файл или соединение с БД.

Работать с такими переменными можно при помощи специальных функций. Функция get_resource_type()вернёт вам тип ресурса, например, файл, mysql соединение и так далее.

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

Функции обратного вызова

Некоторые функции в качестве одного из параметров принимают другую функцию, например, call_user_func(), usort(). Функция может быть анонимной.

<?php
function increment(&$var) { // call_user_func() not passed by reference
    ++$var;
}
$a = 0;
call_user_func('increment', $a);
echo $a; // output 1

Null

  • переменные которым задано значение NULL, созданные без установки значения или же после обработки функцией unset().
  • такие переменные можно проверить функцией is_null()
  • не имеет ни типа, ни значения
  • не тоже самое, что целочисленное значение 0 или пустая строка (они имеют тип).

Переменная для переменной

Такие переменные не могут быть использованы в суперглобальных переменных ($_GET[‘name] и др.).

<?php
$a = 'name';
$$a = "Paul";
echo ${'name'}; //Paul

Переменные функции

<?php
function myfunc() {} // $a = function a(){} is invalid
$f = 'myfunc';
$f(); // will call myfunc(); 

Суперглобальные переменные

  • $_SERVER содержит заголовки, пути, информацию о файле, как, например, адрес, корень документа, http_host, http_user_agent, script_name и др. $_SERVER[‘SCRIPT_NAME’] — только заглавные буквы.
  • $_ENV содержит импортированные переменные из глобального пространства имен.
  • $_REQUEST[‘name’] состоит из $_GET[‘name’], $_POST[‘name’] и $_COOKIE[‘name’], в зависимости от директивы variable_roder $_GET может быть обработана urldecode().
  • $_FILES содержит загруженные данные через POST
  • Точки и пробелы в переменных заменяются на нижние подчеркивания. Например <input name=”a.b” />станет $_REQUEST[“a_b”].
  • При отправке формы, можно использовать изображение вместо стандартной кнопки отправки данных:
  • <input type=”image” src=”image.gif” name=”sub”> После нажатия пользователем в любой точке изображения, к основным данным будут добавлены еще два значения sub_x и sub_y, содержащие в себе координаты точки клика.
  • Cookie — заголовочная часть HTTP, поэтому функция setcookie() должна быть вызвана до отправки данных в браузер. После чего эти данные станут доступны в переменной $_COOKIE в качестве массива.
  • $HTTP_RAW_POST_DATA содержит необработанные POST данные, не работает с enctype=”multipart/form-data.
  • $http_response_header массив равнозначен функции get_headers($url). Используется совместно с file_get_contents($url).
  • При запуске PHP скрипта из командной строки переменная $argc содержит количество параметров переданных скрипту в строке, а $argv — сами параметры в виде массива.

Область видимости

В PHP переменные находятся в пределах определенной области видимости. Эта область зависит от того, где задана переменная. Если переменная создана в пределах функции, а использовать вы её планируете в пределах всего скрипта, то задать её нужно при помощи ключевого слова global.

<?php
function SUM() {
    global $a, $b; return $a + $b;
}
function SUM() {
    return $GLOBALS['a'] + $GLOBALS['b'];
}

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

<?php
function SUM($b) { static $a = 0; $a = $a + $b; return $a; } // each time the function is called, the value of $a will be altered and remembered for the next call

isset()

TRUE если переменная имеет значение отличное от null.

list

<?php
$result = $pdo->query("SELECT id, name, salary FROM employees");
while (list($id, $name, $salary) = $result->fetch(PDO::FETCH_NUM)) {}

Константы

  • Может содержать только скалярное значение, константу изменять нельзя после её установки
  • Имя константы следует указывать только заглавными буквами
  • Используют остальные соглашения для имен в PHP
  • Создаются в глобальной области видимости
  • get_defined_constant() возвращает все заданные константы
  • используйте defined(constant) для проверки задана ли константа
  • если константа не задана, то вы получите в ответ E_NOTICE
  • константы регистрозависимы
<?php
define('ERROR', 'Something went wrong.',TRUE/FALSE); or (from PHP 5.3, only in top-level scope, i.e. not within function, etc.)
const ERROR = 'Something went wrong.';
echo ERROR; or echo constant('ERROR'); // 'Something went wrong.' constant(ERROR) is WRONG echo error will be valid if TRUE is indicated in the 3rd argument which indicates case-sensitivity

Константа — конец строки

Для вывода символа конца строки независимо от ОС

<?php
PHP_EOL;

Магические константы __ХХХ__

Ядро PHP имеет в своем составе ряд предустановленных констант (E_ERROR, TRUE, FALSE, NaN). Эти константы могут принимать различное значение в зависимости от места их использования. Все эти константы регистронезависимы.

  • __LINE__ — Номер текущей строки скрипта
  • __FILE__ — Полный путь к скрипту. При использовании в подключенном файле (include) возвращает имя подключенного файла.
  • __DIR__ — Каталог скрипта. При использовании в подлюченном файле, возвращается каталог подключенного файла. Аналог dirname(__FILE__). Не содержит конечного символа /, если каталог не корневой.
  • __FUNCTION__ — Имя функции. (Добавлено с PHP 4.3.0). Начиная с PHP5 константа содержит имя функции именно в таком виде, в каком она была задана (регистрозависимое имя).
  • __CLASS__ — Имя класса. (Добавлено в PHP 4.3.0). Начиная с PHP5 имя хранится в регистрозависимом виде. Также переменная содержит в себе имя пространства имен. Начиная с PHP 5.4 константа может быть использована в трейтах. При использовании в трейте константа возвращает класс трейта.
  • __TRAIT__ — Регистрозависимое имя трейта. Содержит пространство имен.
  • __METHOD__ — Регистрозависимое имя метода
  • __NAMESPACE__ — Регистрозависимое имя пространства имен

Управляющие структуры и языковые конструкции

Это встроенные в язык элементы. Языковая конструкция — синтаксически верная часть программы, которая состоит из одного или нескольких лексических токенов в соответствии с правилами языка. Часто этот термин используется в качестве синонима управляющей структуры, которая не является функцией.

If

Выбор / альтернатива

<?php
if ():
//...
elseif: // must use elseif, else if can only be used in if() { } else if() { }
//...
else:
//...
endif;

Краткий вариант

<?php
$expr ? true : false;

Switch

Выполняет сравнение ==, не ===

<?php
switch ($i) {
    case 0: // a semi-colon may be used i.e. case 0;
    case 1:
    case 2:
        echo "i is less than 3 but not negative";
    break;
    case 3:
        echo "i is 3";
}
<?php
switch ($i): // альтернативный синтаксис
    case 0:
        echo “i equals 0;
endswitch;

while

do { … break; … } while (0); такой синтаксис do-while цикла позволяет остановить выполнение в середине блока кода.

for

Обратите внимание, что цикл for может не содержать значений

<?php
$i = 1;
for ( ; ; ) {
    if ($i > 10) {break;}
    echo $i++;
}
for ($i = 1, $j = 0; $i <= 10; $j += $i, print $i, $i++);

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

<?php
for($i = 0, $size = count($people); $i < $size; ++$i) {
    $people[$i]['salt'] = mt_rand(000000, 999999);
}

foreach

Работает только с массивами и объектами, внутренний указатель массива автоматически сбрасывается в начальное положение.

foreach ($array as $key => $value) {} или foreach ($array as $value) {}.

Следующее — функциональный аналог:

<?php
$arr = array(“one”, “two”, “three”);
reset($arr);
while (list($key, $value) = each($arr)) {
    echo “Key: $key; Value: $value<br />\n;
}
foreach ($arr as $key => $value) {
    echo “Key: $key; Value: $value<br />\n;
}

break

break принимает в качестве параметра целочисленное значение, которые указывает из какого количества вложенных блоков кода стоит выйти.

break 0; is invalid. break; is identical to break 1;

continue

Continue прекращает текущую итерацию и начинает следующую. После ключевого слова continue следует ставить точку с запятой.

declare

Конструкция declare используется для установки директив выполнения в пределах блока кода. Принимаются только две директивы: ticks, encoding (добавлено в PHP 5.3). Tick — специальное событие, срабатывающее после выполнения определенного количества выражений (убрано в PHP 7).

<?php
declare(ticks=1) {
    // entire script here
}
declare(encoding='ISO-8859-1');
// code here

Директива encoding игнорируется в PHP 5.3 если php был скомпилирован без —enable-zend-multibyte.

return

Return сразу же прекращает выполнение функции и возвращает параметр, переданный ему. Также returnможет прекратить исполнение eval() или всего скрипта. Часто круглые скобки опускаются в return.

<?php
return $a; // возврат значения $a
return ($a); // аналог

require/require_once

  • если искомый файл не был найден то вызывается E_COMPILE_ERROR
  • используется текущий путь или include_path
  • к подключенному файлу применяется та область видимости, в которой он был подключен
  • все функции и классы заданные в подключенном файле имеет глоальную область видимости
  • если код не находится в пределах тега PHP (<?php), то он обрабатывается как HTML
  • если в файле нет выражения return, то возвращается 1 в случае удачного исполнения, FALSE в случае ошибки.
  • если файл был подключен больше одного раза, то PHP вызовет фатальную ошибку.
  • допускается использование auto_prepend_file и auto_append_file в php.ini
  • круглые скобки необязательны $a = require ‘foo.php’

include/include_once

  • аналог require/require_once
  • если файле не был найден, то вызывается E_WARNING ошибка.

goto (начиная с PHP 5.3)

Оператор goto используется для перехода к другой части скрипта. Адрес перехода задается заранее при помощи лейбла и двоеточия. Этот лейбл передается в качестве параметра оператору goto.

Адрес перехода должен быть в пределах одного контекста, то есть вы не можете выйти из функции или метода. Вы можете выйти из конструкций switch или циколов. Часто применяется вместо break.

<?php
for($i=0,$j=50; $i<100; $i++) {
    while($j--) {
        if($j==17) goto end;
    }
}
echo "i = $i";
end:
echo 'j hit 17';

Конструкции вывода

<?php
echo '123'; // нет возвращаемого значения
print 'something'; или print ('something'); // 'something' выводится, 1 возвращается, a function
die; die(); or exit; exit();
return; // останавливает выполнение кода и возвращает значение, последующий код не будет выполнен, но будет пропарсен
__halt_compiler(); // применяется для отладки, код после функции не парсится 
empty(); // проверка emptyeval();
codeinclude/require(); or include_once/require_once();

reset()

reset() — используется для отката позиции указателя массива к началу.

Выдача ошибок

По-умолчанию, PHP выдает абсолютно все ошибки. Если конечно вы не используете отладочную среду, что встречается довольно редко. Уровень вывода ошибок можно установить в php.ini. Наиболее значимыми являются error_reporting, display_errors(on|off) и log_errors(on|off). Разработчики довольно часто используют такие функции как show_source(), highlight_string() и highlight_file() для отладки.

<?php
error_reporting = E_ALL & ~E_NOTICE // в php.ini
error_reporting( E_ALL ^ E_NOTICE ); или ini_set(‘error_reporting’,E_ALL ^ E_NOTICE); // в php скрипте
error_reporting( 0 ); // отключает вывод ошибок в скрипте

Установка обработчика ошибок

В своем скрипте вы можете указать функцию, которая будет вызываться каждый раз при возникновении ошибок.

set_error_handler()

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

<?php
$oldErrorHandler = set_error_handler($myErrorHandler);

Исключения

Исключения могут вызываться и отлавливаться в PHP. Код окружается в блок try. Каждый блок tryдолжен иметь хотя бы один блок catch.

Если исключение не было отловлено, то PHP вызовет фатальную ошибку, в случае когда не был применен set_exception_handler().

Класс exception можно наследовать по необходимости. Применяйте set_exception_handler($nahdler) для отслеживания всех типов исключений. После выполнения указанного обработчика скрипт остановится. Используйте restore_exception_handler() чтобы вернуть старый обработчик.

<?php
try {}
catch (Exception $e) {
    echo $e->getMessage();
}

Пространства имен

http://www.php.net/manual/en/language.namespaces.php

Решает две проблемы:

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

Пространства имен оказывают влияние на 4 элемента кода:

  • классы
  • интерфейсы
  • функции
  • константы

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

namespace A {} namespace B {} namespace {} // global scope

Одно и тоже пространство имен может быть указано в нескольких файлах. Пространство имен может быть задано с подуровнями.

К классу можно обратиться тремя способами:

  1. Неквалифицированное имя файла (без приставки) $a = new foo() или foo::staticmethod(). Если имя текущего пространства имен — currentnamespace, то имя класса становится currentnamespace\\foo. Если код имеет глобальную зону видимости, то foo. Неквалифицированные имена функций и констант переводятся в глобальные функции и константы если не существует функции или константы в текущем пространстве имен.
  2. Квалифицированное имя или имя с приставкой — $a = submaespace\foo() или subnamespace\foo::staticmethod(). Если текущее пространство имен — currentnamespace, то имя класса переводится в currentnamespace\subnamespace\foo. Если код имеет глобальную зону видимости, то код без пространства имен переводится в subnamespace\foo.
  3. Полное квалифицированное имя или имя с приставкой и глобальной приставкой — $a = new \currentnamespace\foo() или \currentnamespace\foo::staticmethod(). Такие имена всегда остается в исходном виде. Обратится к глобальной функции можно следующим образом — \strlen($string).

Значение константы __NAMESPACE__ — строковое значение текущего пространства имен. В глобальном пространстве — пустая строка. Ключевое слово namespace используется для обращения к элементу из текущего пространства имен или из подпространства.

Существует два типа синонимов или импортирования: синоним имени класса или пространства имен. Подключенный файл не наследует пространство имен родителя.

ВНИМАНИЕ: $a=’\my\username'; не $a=“\\my\\username”;

PHP и php — зарезервированные пространства имен PHP.

<?php
namespace my\name; // define the current namespace
class MyClass {}
function myfunction() {}
const MYCONST = 1;
$a = new MyClass;
$c = new \my\name\MyClass; // полное квалифицированное имя
$a = strlen('hi'); // если strlen() не задана в текущем пространстве имен, то вызывается функция из глобального контекста
$d = namespace\MYCONST; // namespace ключевое слово => текущее простраснтво имен
$d = __NAMESPACE__ . ‘\MYCONST';  // должно быть в одинарных кавычках;
?>
<?php
namespace foo;
use My\Full\Classname as Another;
// использование обратного слеша в начале не обязательно, но рекомендуется
use My\Full\NSname;  (не оказывает влияние на пространство имен, так как код в пределах foo)
// импорт глобального класса
use \ArrayObject;
$obj = new namespace\Another; // инициализация объекта foo\Another
$obj = new Another; //инициализация My\Full\Classname
NSname\subns\func(); // вызов функции My\Full\NSname\subns\func
$a = new ArrayObject(array(1)); // инициализация объекта класса ArrayObject
// без “use \ArrayObject” мы получим foo\ArrayObject
?>

Ссылки

Назначение по ссылке

$a = &$b;

$a и $b полностью равны. $a не указывает на $b и наоборот. $a и $b указывает на одно и тоже место в памяти.

Передача по ссылке

<?php
function foo(&$var) {
    $var++;
};
$a=5;
foo($a);  // no need & before foo, E_DEPRECIATED/Fatal Error

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

Возврат по ссылке

<?php
class foo {
  public $value = 42;
  public function &getValue() {
    return $this->value;
  }
}
$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to
$myValue1 = &$obj->getValue();
$obj->value = 2;
echo $myValue;  //2
echo $myValue1;  //2

Используется если вы хотите применить функцию для поиска связи между ссылкой и переменной.

Пользовательские правила

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

  • функции
  • классы
  • интерфейсы
  • константы (за исключением классовых констант)
  • переменные, заданные за пределами классов/функций

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

Двойное нижнее подчеркивание зарезервировано за магическими символами и методами.

Расширения

Php имеет около 86 расширений (расширения ядра для массивов, классов, объектов и т.д.), в каждом в среднем по 30 функций.

Расширения, с которыми php был скомпилирован, могут быть инициализированы с помощью —enable-extname или -with-extname. Прочие необходимо добавить и настроить в файле php.ini.

PEAR (PHP Extension and Application Repository) представляет собой репозиторий (библиотеку) кодов, написанных на php для часто встречающихся функций. Сейчас он развился в систему пакетов, для распространения сторонних библиотек, как, например PECL.

PECL (PHP Extension Community Library) написан на C, что позволяет использовать систему пакетов PEAR. PECL облегчает процесс создания расширений для PHP. Используя команду pecl, выполните следующее:

pecl install extname

Таким образом вы загрузите исходный код extname, скомпилируете и установите extname.so в extension_dir. extname.so затем можно подключить посредством php.ini (добавив строку extension=extname.so)

Ядро PHP состоит из двух частей. На самых низких уровнях вы найдете Zend Engine (ZE). ZE интерпретирует человекочитаемый скрипт в машиночитаемый токен, а затем исполняет этот токен в процессном пространстве. ZE также управляет памятью, зоной видимости переменных и функциями диспетчеризации.

Другая половина ядра это собственно ядро PHP. PHP отвечает за коммуникациею и связь с SAPIlayer (Server Application Programming Interface, по сути это название сред исполнения PHP — Apache, IIS, CLI, CGI и т.д.). SAPI также осуществляет контроль слоя для safe_mode и проверок open_basedir, и потоковых слоев, которые связывают файлы и сети I/O с функциями пользователя, такими, как fopen(), fread() и fwrite().

Когда SAPI запускается, например, в ответ на запуск /usr/local/apache/bin/apachectl, PHP начинает инициализацию подсистем своего ядра. Ближе к окончанию этой процедуры запуска, PHP загружает код каждого расширения и выполняет инициализацию каждого модуля (MINIT). Таким образом каждое расширение инициализирует необходимые переменные, занимает необходимые ресурсы, регистрирует обработчиков ресурсов и функций ZE. Таким образом при вызове одной из этих функций в скрипте, ZE знает какой код необходимо исполнить.

После инициализации запроса ZE перехватывает обработку, перевод PHP скрипт сначала в токены, а затем в коды операции, которые впоследствии исполняет.

Настройки

Файл настройки (php.ini) прочитывается, при каждом запуске PHP, и автоматически ищется в том же каталоге, где установлен сам php или в корневом каталоге сервера в следующем порядке:

  • модуль SAPI
  • переменная phprc
  • ключи реестра
  • HKEY_LOCAL_MACHINE\sofrware\php
  • рабочий каталог
  • каталог (сервера или php)
  • каталог WIN

В версии PHP 5.3.0 php поддерживает INI файлы в стиле .htaccess для каждого каталога через CGI SAPI (по умолчанию файл назван named.user.ini, может быть переименован в user_ini.filename, частота считывания диктуется user.cache_ttl). Для Apache используйте .htaccess.

Режимы каталогов php

Эти режимы определяют, когда и где директива PHP может или не может быть установлена, и каждая директива в руководстве относится к одному из этих режимов. К примеру, некоторые настройки могут быть установлены с помощью PHP-скрипта, использующего ini_set(), тогда как другие могут требовать php.ini или httpd.conf.

  • PHP_INI_USER — Значение может быть настроен скриптами пользователя (как в ini_set()) или в реестре Windows. В PHP 5.3 ввод может быть настроен в .user.ini
  • PHP_INI_PERDIR — Значение может быть настроен в php.ini, .htaccess, htpd.conf или user.ini (в PHP 5.3).
  • PHP_INI_SYSTEM — Значение может быть настроен в php.ini или php.conf.
  • PHP_INI_ALL — Значение может быть настроен любыми способами.

Перечень каталогов php.ini.

При использовании PHP в Apache вы также можете изменить настройки, используя каталоги Apache (например, httpd.conf) или файлы .htaccess. Для этого вам будут необходимы права на “AllowOverride Options” или “AllowOverride All”. Пример такой конфигурации в apache:

<IfModule mod_php5.c>
php_value include_path ".:/usr/local/lib/php" [php_value name value]
php_flag engine on [php_flag name on|off]
</IfModule>
<IfModule mod_php4.c>
php_admin_value include_path “.:/usr/local/lib/php”
php_admin_flag engine on
</IfModule>

register_globals отключена по умолчанию и означает, что index.php?get=done доступна только для $_GET[‘get’], а не $get

magic_quotes отключена по умолчанию (как устаревшая в PHP 5.3.0) register_long_arrays ($HTTP_*_VARS) устаревшая в PHP 5.3.0 и отключена в PHP 5.4.0. variables_order EGPCS позволяет серверу интерпретировать переменные в порядке Environment, Get, Post, Cookie и Server (последний всегда переписывается на имя переменной), если не указано, тип переменной может вообще не интерпретироваться.

Производительность — механизмы сборки мусора.

а) сокращение использования памяти

Внедрение механизма сбора мусора сокращает использование памяти путем очищения циклически зависимых переменных при выполнении необходимых условий. В PHP это происходит, когда переполняется корневой буфер или когда вызывается функция gc_collect_cycles().

При записи возможных корней в PHP 5.3, сбор мусора наиболее эффективен для снижения риска утечки памяти и, как следствие, уменьшение рабочего объема памяти. Хотя запись возможных корней по сравнению с отсутствием записи как таковой в PHP 5.2, происходит достаточно медленно, это все равно оказывает очень сильное действие на производительность системы в целом.

в) задержки при выполнении Сборщики мусора препятствуют производительности, поскольку затрачивается больше времени для выполнения дополнительных процессов.

Заключение

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

Тем не менее в случае задействования алгоритмов сборки в обычных скриптах освобождается достаточно памяти для одновременной работы нескольких однотипных скриптов, поскольку в целом объём используемой оперативной памяти не велик.

Преимущества видны на длительных скриптах, таких, как тесты или скрипты, работающие в качестве служб.

Байт код PHP

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

При наличии одного неизменного PHP скрипта, байт-код тоже будет оставаться без изменений. Таким образом при каждом исполнении скрипта вы выполняете абсолютно не нужное формирование байт-кода, что приводит к потери процессорного времени. Именно поэтому существует ряд механизмов кеширования.

После компилирования байт-код хранится в оперативной памяти. Он выполняется напрямую из памяти при следующем вызове скрипта, что позволяет избежать повторного компилирования. Наиболее популярной системой кеширования является Alternative PHP Cache (APC) или OPCache встроенный в php 5.5 (но по умолчанию отключён). Просто установите расширение и создавайте файлы PHP как обычно, APC возьмет процесс кеширования на себя.

Основы функций

  • Функция может содержать в себе любой корректный PHP код, включая другие функции и классы.
  • Функция не обязательно должна быть определена до вызова, за исключением её использования в условных операторах.
  • Объявленную функцию нельзя переопределить.
  • В PHP все функции и классы имеют глобальную область видимости — их допускается вызывать даже за пределами функции в случае, когда они были заданы внутри этой функции и наоборот.
  • имена функций не чувствительны к регистру
  • типы: встроенные, определенные пользователем, сторонние (например из расширений).
  • global $id; или $GLOBALS["id"] используются для доступа к глобальным переменным (по сути global $idэто ссылка на $var = & $GLOBALS["id"]).
  • В PHP5 появилась возможность задать значение параметра функции по-умолчанию даже для параметров, передаваемых по ссылке (если параметр не был передан, то создается новая переменная).
  • В PHP5 объекты всегда передаются по ссылке, если только они не были клонированы.
  • допускается рекурсивный вызов функций (то есть function recursion($a) { if($a<10){recursion($a+1);} }), следите за тем, чтобы выполнение функций было ограниченно.
  • чтобы проверить существует ли функции в контексте используйте function_exists($function_name).
  • $arr = get_defined_functions() — даст вам полный список всех функций, $arr['user'] — функции заданные пользователем.
<?php
function printList($string, $count = 5) {
    // значения по умолчанию должны быть расположены справа
}
function printList($count=5, $string) {
} // вот так неправильно
function newTo5(&$number = 2) {
} // в PHP 5, значение по умолчанию может быть передано по ссылке
function fun($x, $x=1, $x=2) {
    return $x;
}
echo fun(3); // выдаст 2, аргументы вычисляются слева направо
function fun($x) {
    return $x;
}
echo fun(3,4,5,6,7,8); // выдаст 3, будет выдано предупреждение только тогда, когда передаётся меньше аргументов, чем определено в заголовке функции

Возвращаемое значение

  • возврат значение происходит при помощи оператора return.
  • если параметр, переданный функции не соответствует ожидаемому типу, например, был передан массив, а функции ожидает строковое значение, то возвращаемое значение функции не определенно.
  • функция может вернуть любое значение, включая массивы и объекты.
  • после оператора return функция прекращает свое выполнение и передает управление строке, следующей за вызовом функции.
  • если оператор return отсутствует, то функция возвращает null.

Ссылки

<?php
function &name() {
    return $someref;
}
$newref = & name();
  • позволяет вернуть переменную в качестве самой функции, вместо копирования.
  • применяется для работы с ресурсами и при реализации шаблона Фабрика.
  • вы должны вернуть переменную, а не выражение или строковое значение.
  • function &hello() {return "hello"} — неверно, будет выдан предупреждение об ошибке (Notice).
  • передача по ссылке во время вызова (то есть & добавляется не во время определения функции, а при вызове). Считается устаревшим подходом с PHP 5.3, а в PHP5.4 вызывает фатальную ошибку.

Переменные функции

<?php
$func = 'foo'; $func('test');  // Вызовет foo('test');
$foo = new Foo();
$func='variable';
$foo->$func(); // Вызовет $foo->variable();
  • если к имени переменной добавить круглые скобки, то PHP будет искать функцию с тем именем, которое заложено в значении этой переменной.
  • применяется для реализации функций обратного вызова.
  • Такие функции не работают с языковыми конструкциями как echo, print, unset(), isset(), empty(), include, require и так далее. Используйте обертку для использования функций в таких конструкциях.

Неверно:

<?php
$x = function fund($a) {
    return $a;
};
print $x(1);

Анонимные функции (Лямбда функции) и замыкания

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

<?php
$greet = function($name) {
    printf("Hello %s\r\n", $name);
}; // завершающая точка с запятой НЕОБХОДИМА
$greet('World');
$greet('PHP');

В анонимных функциях допускается использование func_num_args(), func_get_args() и func_get_arg(). Используйте is_callable($ab), чтобы проверить является ли $ab анонимной функцией.

create_function() применяется для создания анонимных функций в PHP. Эта функция генерирует случайное имя для функции и возвращает его в качестве строки.

<?php
$foo = create_function('$x,$y', 'return $x*$y;');
// должны быть одинарные кавычки экранированы в двойные кавычки, в противном случае переменные будут вычисляться
echo $foo(10, 20);

Замыкание в программировании — функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции в окружающем коде и не являющиеся её параметрами.

В PHP5.3.0 был включен final класс Closure. Он применяется для внутренней реализации анонимных функций. Класс включает в себе конструктор, запрещающий ручное создание объекта (вызывает E_RECOVERABLE_ERROR) и метод __invoke, реализующий магический вызов. Замыкание наследует переменные из родительской области видимости.

<?php
// определяется в классе Cart публичная функция getTotal($tax)
// use ($tax, &$total) - доступ к переменным из родительского контекста
$callback = function ($quantity, $product) use ($tax, &$total) {
    $pricePerItem = constant(__CLASS__ . "::PRICE_" .strtoupper($product));
    $total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
array_walk($this->products, $callback);

Строки — основы

  • выделяются одинарными или двойными кавычками
  • двойные кавычки применяются в случае парсинга переменных или использования специальных символов (\n). На скорость обработки данных не влияет
  • strlen($string) — возвращает длину строки, а именно количество байт, а не символов
  • str_word_count($string, $format, $charlist) — возвращает количество слов, $format (0 — возврат количества слов, 1 — массив из всех слов, 2 — ассоциативный массив, где в качестве ключей — положение в строке (индекс)), $charlist — список символов, из которых может состоять слово (то есть 3 — слово fri3nd будет посчитано).
  • count_chars($string, 1) — считает количество вхождений символов, 1 — режим, возвращает массив со всеми символами (0 — возвращает символы, не входящие в строку).
  • soundex($string) // высчитывает soundex ключ строки (строка длинной в 4 символа, начинающаяся с буквы), для поиска по произношению, например, soundex(“Euler”) == soundex(“Ellery”); // E460
  • metaphone($string, $phonemes) — высчитывает metaphone ключ для строки (является более точным сравнением чем soundex(), так как в ней учитываются правила произношения в английском языке, сгенерированные ключи разной длины), $phonemes ограничивает список возвращаемых символов.
  • trim($string, $optional_char_list) — убирает пробелы из начала и окончания строки (space/tab/newline); если задан $optional_char_list, то указанные символы так же удаляются.
  • ltrim($string, $optional_char_list) — удаляет пробелы из начала строки.
  • rtrim($string, $optional_char_list) — аналог chop(), удаляет пробелы с конца строки.

Сравнение строк

  • $string1 == $string2 — сравнение с приведением типов
  • $string1 === $string2 — сравнение с учетом типа данных
  • strcmp($string1,$string2) — регистрозависимое сравнение, возвращает < 0 если str1 меньше str2; > 0 если str1 больше str2, и 0 если они равны (=== 0)
  • strcasecmp($string1,$string2) — сравнение без учета регистра
  • strncasecmp($string1,$string2,$length)  $length длина строки для сравнения
  • similar_text($string1,$string2[,$percentage]) — возвращает количество совпадающих символов, если был передан третий параметр, то эта перемена получит процент совпавших символов ($percentage)
  • levenshtein($string1,$string2) — расстояние Левенштайна между строками, то есть минимальное число символов, которые потребуется заменить/удалить/добавить чтобы получить идентичные строки, применяется для грубого нахождения ошибочных слов. Например, levenshtein(“ca”,”cn”) == 1

Форматирование строк

  • localeconv() — массив, содержащий информация для форматирования строк с учетом локали.
  • nl_langinfo($item) — возвращает информацию о языке и локали
  • setlocale ( LC_ALL, ”zh-hk”) — устанавливает локаль для функций, работающих с ней.
  • number_format ($number) — возвращает отформатированное число
  • money_format ($format, $number)  money_format() не существует в Windows.
  • quotemeta($string)— добавляет обратный слеш перед следующими символами: . \ + * ? [ ^ ] ( $ )
  • htmlspecialchars($string) — переводит &,”,’,<,> в HTML элементы, то есть «
  • htmlspecialchars_decode($string) — переводит элементы из предыдущей функции в специальные символы
  • htmlentities($string,FLAGS) — переводит все, что можно в HTML элементы, необходимо только если ваша страница в одной из следующих кодировок ASCII или LATIN-1, но не UTF-8.
  • html_entity_decode ($string) — переводит все HTML элементы в строки
  • get_html_translation_table(HTML_ENTITIES | HTML_SPECIALCHAR) — возвращает таблицу перевода для htmlspecialchars() и/или htmlentities(), по-умолчанию — для обоих функций
  • strip_tags($string,$allowable_tags) — удаляет все открывающие и закрывающие теги (за исключением $allowable_tags) из строки
  • nl2br($string) — переводит символ новой строки в <br>
  • wordwrap ($string,$length,$break_symbol,$breakwords); — добавляет $break_symbol или, по-умолчниаю, "\n" через каждые $length, если $breakwords установлена в TRUE, то слова будут разбиваться (по-умолчанию FALSE)
  • ucfirst ($string); — перевод первого символа в верхний регистр
  • lcfirst ($string); — перевод первого символа в нижний регистр
  • strtoupper ($string); — перевод строки в верхний регистр
  • strtolower ($string); — перевод строки в нижний регистр
  • ucwords ($string);— перевод первого символа каждого слова в строке
  • bin2hex ($string); hex2bin ($string); — перевод бинарных данных в шестнадцатеричный формат (ASCII представление), и наоборот
  • convert_cyr_string($string); — перевод из одного набора кириллических символов в другой
  • hebrev($string); — Преобразует текст на иврите из логической кодировки в визуальную (только для rtl текста)
  • hebrevc ($string); — Преобразует текст на иврите из логической кодировки в визуальную с преобразованием перевода строки
  • chr($ascii); — возвращает специальный символ, то есть chr(10) -> \n
  • ord($string); — возвращает ASCII значение, то есть ord(“\n”) -> 10
  • convert_uuencode($string); — кодирует строку с использованием uuencode алгоритма, переводя строки в печатуемые символы, примерно на 35% больше от оригинала
  • convert_uudecode($string); — декодирует
  • base64_encode($string); — кодирует с применением base64 алгоритма, примерно на 33% больше от оригинада
  • base64_decode($string); — декодирует
  • quoted_printable_encode($string);— PHP 5.3 Кодирует 8-битную строку в с помощью метода quoted-printable для использования в MIME
  • quoted_printable_decode($string); — декодирует
  • print ($string); или print “$string”; — всегда возвращает 1
  • printf ($format, $args, …); — выводит отформатированную строку, возвращает длину выведенной строки, то есть $str = printf(‘Hello %s‘,’Edward’); печатает Hello Edward, $str == 12
  • sprintf ($format, $args); // возвращает отформатированную строку
  • vprintf ($format, $array_args); // выводит отформатированную строку, принимает массив в качестве аргумента
  • vsprintf (); // возвращает отформатированную строку, принимает массив в качестве аргумента
  • fprintf ($handle, $format, $args); // передает отформатированную строку ресурсу, например, при записи строки в открытый файл
  • sscanf ($string, $format, $optional_args); // читает из $string и форматирует в соответствии с $format в качестве массива, если $optional_args передан, то значения $format будут назначены $optional_args
  • fscanf ($handle, $format, $optional_args); // читает из ресурса, например, из файла, при каждом вызове читается одна строка
  • str_pad ($string,$length,$optional_padding_character); // Дополняет строку другой строкой до заданной длины

Примеры

<?php
$format = 'The %2$s contains %1$04d monkeys'; // 2$=>the second argument, 04d=>with 4 digits
echo printf($format, $num, $location); // The tree contains 0005 monkeys
$s = 'monkey'; $t = 'many monkeys';
printf("[%s]\n",$s); // standard string output [monkey]
printf("[%10s]\n",$s); // right-justification with spaces [    monkey]
printf("[%-10s]\n",$s); // left-justification with spaces [monkey    ]
printf("[%010s]\n",$s); // zero-padding works on strings too [0000monkey]
printf("[%'#10s]\n",$s); // use the custom padding character '#' [####monkey]
printf("[%10.10s]\n",$t); // left-justification but with a cutoff of 10 characters [many monke]
$number = 1234.56;
setlocale(LC_MONETARY, 'en_US');
$money_format = money_format('%i', $number) . "\n"; // USD 1,234.56
$english_format_number = number_format($number, 2, '.', ','); // 1,234.56
$test = "string 1234 string 5678";
$result = sscanf($test, "%s %d %s %d"); // $result = array('string','1234','string','5678');

Параметры формата функции printf()

  • % — символ процента. Аргумент не используется.
  • b — аргумент трактуется как целое и выводится в виде двоичного числа.
  • c — аргумент трактуется как целое и выводится в виде символа с соответствующим кодом ASCII.
  • d — аргумент трактуется как целое и выводится в виде десятичного числа со знаком.
  • e — аргумент трактуется как число в в научной нотации (например, 1.2e+2). Описатель точности указывает на количество знаков после запятой, начиная с версии PHP 5.2.1. В более ранних версиях он обозначал количество значащих цифр (на один знак меньше).
  • E — аналогично %e, но использует заглавную букву (например, 1.2E+2).
  • u — аргумент трактуется как целое и выводится в виде десятичного числа без знака.
  • f — аргумент трактуется как число с плавающей точкой и также выводится в зависимости от локали.
  • F — аргумент трактуется как число с плавающей точкой и также выводится, но без зависимости от локали. Доступно, начиная с версии PHP 4.3.10 и PHP 5.0.3.
  • o — аргумент трактуется как целое и выводится в виде восьмеричного числа.
  • s — аргумент трактуется как строка.
  • x — аргумент трактуется как целое и выводится в виде шестнадцатиричного числа (в нижнем регистре).
  • X — аргумент трактуется как целое и выводится в виде шестнадцатиричного числа (в верхнем регистре).

Экранирующие последовательности

  • \n перевод строки (LF или 0x0A (10) в ASCII)
  • \r возврат каретки (CR или 0x0D (13) в ASCII)
  • \t табуляция (HT или 0x09 (9) в ASCII)
  • \ обратный слеш
  • \$ знак доллара
  • \” двойные кавычки
  • [0-7]{1,3} последовательность символов, совпадающих с регулярным выражением.

Функции

substr($string, $start, $length) – возвращает подстроку начина с $start длиной $length – отрицательный $start отсчитывается с конца строки – отрицательный $length отсчитывается с конца строки – возвращает FALSE в случае ошибки или пустой строки

substr_compare($string1, $string2, $offset, $length, $case-insentivity) – бинарно безопасное сравнение двух строк начиная с $offset и длиной $length – возвращает 0 если строки равны

substr_count($haystack, $needle, $offset) – возвращает число повтроений подстроки

substr_replace($string, $replacement, $start, $length) – заменяет часть строки

strstr($haystack, $needle, TRUE | FALSE) — TRUE если до, FALSE включая $needle и далее

stristr($haystack, $needle, TRUE | FALSE) — без учета регистра strchr($haystack, $needle, TRUE | FALSE ) – возвращает часть $haystack после(и включая) или до первого появления $needle – например $email = ‘[email protected]’; $domain = strstr($email, ‘@’); — $domain==’@example.com’ $user = strstr($email, ‘@’, TRUE); // $user == ‘name’

strpos($haystack, $needle, $offset) stripos($haystack, $needle, $offset) — без учета регистра strrpos($haystack, $needle, $offset) — поиск с конца – находит первый повтор $needle в строке (допускается пропуск первых символов $offset)

strpbrk($string, $charlist) — с учетом регистра – разбивает строку в месте нахождения символа и возвращает строку или FALSE в случае, если символ не был найден

str_replace($search, $replace, $subject) str_ireplace($search, $replace, $subject) — без учета регистра – находи и заменяет часть строки, $search может быть массивом, дополнительно можно задать $count в качестве четвертого аргумента, которому будет передано количество замен

strtr($string, $from, $to) strtr($string, $replace_array) – переводит символы или заменяет подстроки – например echo strtr(“baab”, “ab”, “01”); // 1001 – например $trans = array(“ab” => “01”); echo strtr(“baab”, $trans); // ba01

str_repeat($string, $times) — повторяет строку $times раз

str_split($string,$maximum_length) – разбивает строку на массив, каждый длиной не более чем $maximum_length

strspn($string, $charlist, $start, $length) – Возвращает длину участка в начале строки, полностью соответствующего маске

strcspn($string,$charlist,$start,$length) – Возвращает длину участка в начале строки, не соответствующего маске

strrev($string) – Переворачивает строку задом наперед

str_shuffle($string) – Перемешивает строку

parse_str($string,$array) – разбивает строку в переменные, $str = “first=value&arr[]=foo+bar&arr[]=baz”;

parse_url($url) – разбивает url по элементам в ассоциативный массив

str_getcsv($input,$delimiter,…) – PHP > 5.3, разбирает CSV строку в массив

get_magic_quotes_gpc() – возвращает 1 если magic_quotes_gpc включены, 0 если нет

addslashes($string) – добавляет символ обратного слеша перед “,’,\,NUL

stripslashes($string) – убирает символы слеша из строки

addcslashes($string, $charList_to_add) – экранирует символы из $charList_to_add, [\]^_~ всегда экранируются

stripcslashes($string, $charList_to_add) – удаляет экранирование сделанное при помощи addcslashes

strtok($string,$delimiter) – разбивает строку $string по разделителю $delimiter и возвращает (разделитель не включается) – при последующих вызовах можно использовать strtok($delimiter), разделитель не включается

chunk_split($string) – разбивает строку на части, например применяется в base64_encoding() или при выводе email

crypt($string, $optional_salt) – однопроходное кодирование строки $string, возвращает хешированную при помощи Unix DEX алгоритма строку или используя другие алгоритмы доступные в системе (начиная с PHP 5.3, PHP содержит в себе собственные алгоритмы), например, $hashed_password = crypt(‘mypassword’); if (crypt($user_input, $hashed_password) == $hashed_password) { echo “Password verified!”; } – чем защищеннее, тем медленее

crypt_md5() – кодирует строку при помощи md5 алгоритма.

hash($algo, $data) – возвращает хеш, полученный алгоритмом в $algo

md5($string) md5_file($filestream) – возвращает хеш в виде 32-символьного шестнадцатеричного числа

crc32($string) – Функция вычисляет циклический избыточный код 32-битных полиномов (CRC32) для строки. Это обычно используется для контроля целостности передаваемых данных.

sha1($string) sha1_file($filestream) – Возвращает хеш в виде 40-символьного шестнадцатеричного числа

str_rot13($string) – сдвигает каждую букву на 13 позиций в алфавите, кодирование и декодирование производится одной функцией.

mbstring (многобайтовая строка)

  • несмотря на то, что во многих языках достаточно 8-мибитового значения для хранения всех символов, это правило не распространяется на все языки (Байт состоит из 8ми бит. Каждый бит может содержать два значения, 1 или 0. Поэтому байт может содержать 256 различных значений (2 в степени 8)). Схемы кодирования многобайтовых символов были разработаны, чтобы можно было представить более 256 символов в обычной побитовой системе кодировки.
  • по-умолчанию этот модуль отключен, включается в настройке (—enable-mbstring=all)
  • для перегрузки функции установите mbstring.func_overload в php.ini в положительное значение, чья битовая маска отвечает за то, какие функции были перегружены. Если установить этот параметр в 1, то будет перегружена функция mail(). 2 — строковые функции, 4 — регулярные выражения и так далее.
  • обрабатывает преобразование кодировок
  • mb_check_encoding($string, $encoding) — проверяет соответствует ли строка кодировке
  • mb_internal_encoding(“UTF-8”) — устанавливает внутреннюю кодировку
  • mb_strlen()

PCRE (регулярные выражения в соответствии с Perl)

  • совместимо с многобайтовыми строками
  • разделитель — применяется в начале и конце каждого шаблона, можно его установить вручную, обычно используются “/”, “#”, “~”, “!” или скобки: {pattern}
  • жадность — по-умолчанию возвращается максимально возможное количество совпадений символов

Мета символы

  • \ основной экранирующий символ
  • [] класс
  • | или
  • () подшаблон
  • [^] отрицание класса, должно быть размещено на месте первого символа
  • [-] диапазон

Классы символов

  • \d цифры 0-9 [:digit:]
  • \D все, кроме цифр
  • \w любой буквенно-численный символ или знак нижнего подчеркивания (_) [:word:]
  • \W все кроме буквенно-численных символов или знака нижнего подчеркивания
  • \s любой пробел (пробел, табуляция, новая строка) [:space:]
  • \S любой символ, кроме пробела
  • . любой символ кроме новой строки
  • alnum буквы и числа
  • alpha буквы
  • lower буквы в нижнем регистре
  • upper буквы в верхнем регистре

Анкоры (якоря)

  • ^ начало строки
  • $ конец строки (если включен многострочный режим, /n — аналог окончания строки)

Указатели положения

  • \b граница слова
  • \B не граница слова
  • \A начало строки
  • \Z окончание строки или символ новой строки в конце
  • \z конец строки
  • \G положение первого соответствующего символа

Кванторы

  • ? встречается 0 или 1 раз
  • * встречается 0 и более раз
  • + встречает 1 и более раз
  • {n} встречается n раз
  • {,n} встречается не более n раз
  • {m,} встречается m и более раз
  • {m,n} встречается между m и n раз
  • Комбинация ? и или + изменяет алгоритм на нежадный, например `?или+?`

Свойства unicode символов (для UTF-8)

  • \p{xx} символ со свойством xx
  • \P{xx] символ со свойством не равным xx
  • \X расширенная последовательность Unicode

Изменение шаблона

  • i – поиск без учета регистра
  • m – многострочный режим, $ и ^ соответствуют новым строкам
  • s – точка будет соответствовать новой строке
  • x – разрешает комментирование
  • U – устанавливает нежадный алгоритм
  • u – включает поддержку UTF8
  • e – позволяет использовать preg_replace()

Пример

$pattern = '/^\s+/i';

Функции

preg_match($pattern, $subject, $matches, $flags, $offset); — выполняет обычную обработку регулярного выражения, находит соответствие, останавливается после первого совпадения, возвращает 1 при обнаружении соответствия, 0 если соответствий не было найдено, FALSE при возникновении ошибки

preg_match_all (); — осуществляет глобальную обработку регулярного выражения и возвращает число совпадений

preg_grep($pattern, $array); — возвращает массив, состоящий из элементов входного массива, которые соответствуют шаблону, ключи сохраняются, то же самое что и preg_filter но без замещения

preg_filter($pattern, $replace, $subject); — возвращает и заменяет $subject при совпадении, $subject может быть массивом

preg_replace($pattern, $replace, $subject); — возвращает $subject после замещения всех соответствий

preg_replace_callback($pattern, $callback, $subject) — изменяет строки при помощи функции обратного вызова

$array = preg_split ($pattern, $string); — массив из $string разделенную по шаблону $pattern

preg_quote ($sting, $optional_delimiter); — форматирует строку в PECL шаблон с экранирующими символами

preg_last_error(); — возвращает код ошибки последней обработки регулярного выражения, например, PREG_NO_ERROR, PREG_BAD_UTF8_OFFSET_ERROR