Подготовка к Zend сертификации : Основы PHP

Эта статья - первая часть заметок по подготовке к экзамену по 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 возьмет процесс кеширования на себя.

Комментарии

0
Войти
Комментариев нет.
Войдите чтобы оставлять комментарии.