PHP: различия между версиями

Содержимое удалено Содержимое добавлено
мНет описания правки
мНет описания правки
Строка 57:
При объявлении переменных — в '''РНР''' не требуется явно указывать тип переменной; при этом, одна и та же переменная может иметь, на протяжении программы, разные типы.
 
Переменная инициализируется в момент присвоения ей значения и существует до тех пор, пока выполняется программа (в случае ''web''-страницы — до тех пор, пока не завершён запрос), или она не будет удалена функцией <code>unset()</code>.
 
=== Функции вывода ===
В '''PHP''' существует несколько способов вывести что-либо в [[w:Веб-страница|веб-страницу]]:
{| class="wikitable"
*Операторы <code>echo</code> и <code>print</code>
!Средство
*:Работают одним и тем же образом, но '''print''' всегда возвращает "1", в то время как '''echo''' ничего не возвращает. Выводят значение аргумента.
!Результат
*Функция <code>print_r()</code>
|-
*:Позволяет корректно выводить массивы.
*Функция|Операторы <code>var_dump()echo</code> и <code>print</code>
|Выводят значение аргумента, одним и тем же образом.
*:Выводит переменную вместе с типом. Очень удобный инструмент для отладки.
 
Различие: <code>print</code> — всегда возвращает "1"; <code>echo</code> — ничего не возвращает.
|-
|Функция <code>print_r()</code>
|Позволяет корректно выводить массивы.
|-
|Функция <code>var_dump()</code>
|Выводит переменную вместе с типом. Очень удобный инструмент для отладки.
|}
 
==== Вывод различных функций ====
Строка 115 ⟶ 124 :
 
=== Типы данных в РНР ===
Как уже было сказано, '''PHP''' предоставляет определённую гибкость в отношении типов переменных, — то есть, с одной и той же переменной, на протяжении программы, можно работать ''и как со строкой, и как с числом.'' Однако, несмотря на это, в '''РНР''' существуютсуществует набор основных типов данных, которые могут явно указываться при работе с переменными:
{| class="wikitable"
*integer (целые числа);
!Обозначение
*string (строки);
!Тип данных
*boolean (двоичные данные (или "Истина", или "Ложь"));
|-
*double, если после точки 1 или 2 цифры; float, если больше (числа с плавающей точкой);
|integer
*[[PHP/Массивы|array]] (массивы);
|Целое число.
*object (объекты);
|-
*NULL (пустой тип);
|string
*Resource (ресурсы);
|Строка символов.
 
|-
|boolean
|Двоичное данное (либо «Истина», либо «Ложь»).
|-
|double
|Десятичное число; 1—2 значащих разряда в дробной части.
|-
|float
|Десятичное число с плавающей точкой. Более 2 значащих разрядов в дробной части.
|-
|[[PHP/Массивы|array]]
|Массив объектов.
|-
|object
|Объект.
|-
|NULL
|Пустой тип.
|-
|Resource
|Ресурс.
|}
Есть функция <code>gettype()</code>, возвращающая тип, который '''РНР''' назначил переменной:
<source lang="php">
<?php
$var1 = '5';
$var2 = 5;
echo gettype($var1) . '<br>'# .Будет gettype($var2);возвращено: "string".
. '<br>' # Операция "." используется для склеивания строк.
. gettype($var2); # Будет возвращено: "integer".
?>
</source>
 
В первом случае, '''РНР''' вернёт <code>string</code>; во втором — <code>integer</code>.
 
Стоит заметить, что операция «'''.'''» (точка) используется для склеивания (конкатенации) строк.
 
Существует также функция <code>settype()</code>, которая явно устанавливает тип:
Строка 143 ⟶ 172 :
<?php
$var = '5';
echo gettype($var); # Будет возвращено: "string".
settype($var, 'integer');
echo '<br />' . gettype($var); # Будет возвращено: "integer".
?>
</source>
 
Кроме функции <code>settype()</code>, преобразование типов в '''РНР''' можно осуществлять при помощи операторов преобразования типов. Преобразование типов осуществляется путём указания перед переменной её нового типа, взятого в скобки:<source lang="php">
Выполнение этого фрагмента кода приведёт к такому же результату, как и предыдущего.
 
Кроме функции <code>settype()</code>, преобразование типов в '''РНР''' можно осуществлять при помощи операторов преобразования типов. Преобразование типов осуществляется путём указания перед переменной её нового типа, взятого в скобки:
<source lang="php">
$var = (integer)$var;
</source>
 
Соответственно, выполнение следующего кода приведёт к тому, что '''РНР''' вернёт «''integer»'':
<source lang="php">
<?php
$var = '5'; //# Изначально, создаётся переменная типа "string" (строковая).
$var = (integer)$var; //# Преобразуем её тип в "intinteger" (целочисленный).
echo gettype($var); //# Отображаем окончательный тип переменной: "integer".
?>
</source>
 
=== Внешние переменные ===
После того, как запрос клиента проанализирован веб-сервером и передан '''РНР'''-интерпретатору — последний устанавливает ряд переменных, которые содержат данные, относящиеся к запросузапроса и доступны всё время его выполнения.:
# Сначала '''PHP''' инициализирует массивы <code>$_ENV</code> (содержащий переменные среды-окружения; англ. ''environment'') и <code>$_SERVER</code><ref>На самом деле, порядок инициализации суперглобальных массивов зависит от настроек в файле ''php.ini''</ref>. Ассоциативный массив <code>$_SERVER</code> содержит следующие ключи (индексы массива): {| class="wikitable" !Ключ (индекс ячейки массива) !Полный путь к ячейке массива !Содержимое ячейки массива |- |<code>HTTP_USER_AGENT</code> |<code>$_SERVER['HTTP_USER_AGENT']</code> |Сведения о браузере клиента. |- |<code>HTTP_ACCEPT</code> |<code>$_SERVER['HTTP_ACCEPT']</code> |Принимаемые MIME-типы. Может служить для определения возможностей браузера. |- |<code>PHP_SELF</code> |<code>$_SERVER['PHP_SELF']</code> |Путь к файлу, содержащему выполняющийся скрипт, относительно корневого каталога (папки) сервера. Пример: <code>/w/index.php</code>. |}
 
# Затем '''РНР''' заполняет переменную <code>$_GET[]</code>, являющуюся ассоциативным массивом, которая создаётся при анализе строки запроса. Строка запроса хранится в элементе массива <code>$_SERVER['QUERY_STRING']</code> и представляет собой информацию, следующую за символом «?» в запрошенном URL. '''РНР''' разбивает строку запроса по символам «&»<ref>Символ разделения также может меняться в файле ''php.ini''. Часто используется символ «;».</ref> на отдельные элементы, а затем ищет в каждом из этих элементов знак «=». Если знак «=» найден, то создаётся переменная с именем из символов, стоящих слева от знака равенства. Рассмотрим следующую форму:
Сначала '''PHP''' инициализирует массивы <code>$_ENV</code> (переменные окружения) и <code>$_SERVER</code><ref>На самом деле, порядок инициализации суперглобальных массивов зависит от настроек в файле ''php.ini''</ref>. Ассоциативный массив <code>$_SERVER</code> содержит следующие ключи (индексы массива):
*<code>$_SERVER['HTTP_USER_AGENT']</code> — браузер клиента;
*<code>$_SERVER['HTTP_ACCEPT']</code> — принимаемые MIME-типы. Может служить для определения возможностей браузера;
*<code>$_SERVER['PHP_SELF']</code> — путь к файлу, содержащему выполняющийся скрипт, относительно корневого каталога (папки) сервера. Пример: <code>/w/index.php</code>
 
Затем '''РНР''' заполняет переменную <code>$_GET[]</code>, являющуюся ассоциативным массивом, которая создаётся при анализе строки запроса. Строка запроса хранится в элементе массива <code>$_SERVER['QUERY_STRING']</code> и представляет собой информацию, следующую за символом «?» в запрошенном URL. '''РНР''' разбивает строку запроса по символам «&»<ref>Символ разделения также может меняться в файле ''php.ini''. Часто используется символ «;».</ref> на отдельные элементы, а затем ищет в каждом из этих элементов знак «=». Если знак «=» найден, то создаётся переменная с именем из символов, стоящих слева от знака равенства. Рассмотрим следующую форму:
 
<source lang="html5">
<!DOCTYPE html>
Строка 191 ⟶ 212 :
<input type="text" name="HDD" />
<br />
<p>
CDROMCD-ROM:
</p>
<input type="text" name="CDROMCD-ROM" />
<br />
<input type="submit" value="Отправить" />
</form>
Строка 202 ⟶ 225 :
</source>
 
Если Вы сохраните этот фрагмент кода в виде HTML-файла и откроете его в веб-браузере, то увидите форму ввода. Если в строке «HDD» набрать какой-либо текст (к примеру, ''«''Maxtor»), и также в строке «CD-ROM» (например, «Nec»), то по нажатию на '''«Отправить»''' будет составлен запрос:
Если Вы в этой форме в строке "HDD" наберёте, к примеру, ''«Maxtor»'', а в строке "CDROM" ''«Nec»'', то она сгенерирует следующую форму запроса:
 
<code>[http://localhost/PHP/test.php?HDD=Maxtor&CDROM=Nec http://localhost/PHP/test.php?HDD=Maxtor&CD-ROM=Nec]</code> — и при этом '''РНР''' создаст следующие элементы массива с соответствующими индексами (ключами): <code>$_GET['HDD'] = 'Maxtor'</code> и <code>$_GET['CDROM'] = 'Nec'</code>. Вы можете работать с ними (т.е. с этими переменными) из Вашего скрипта (у нас — "test.php") как с обычными переменными; в нашем случае — они просто выводятся на экран:
<code>http://localhost/PHP/test.php?HDD=Maxtor&CDROM=Nec</code>
 
В нашем случае '''РНР''' создаст следующие элементы массива с соответствующими индексами (ключами): <code>$_GET['HDD'] = 'Maxtor'</code> и <code>$_GET['CDROM'] = 'Nec'</code>.
 
Вы можете работать с этими переменными из Вашего скрипта (у нас — "test.php") как с обычными переменными. В нашем случае они просто выводятся на экран:
 
<source lang="php">
Строка 225 ⟶ 244 :
</source>
 
Первый параметр этой функции — имя константы, второй — её значение. При использовании константы, на неё ссылаются по имени:
<source lang="php">
<?php
Строка 237 ⟶ 256 :
</source>
 
По традиции имена констант пишут буквами верхнего регистра. И хотя это только традиция, мы Вам рекомендуем ейВам следовать ей, поскольку «плохие» программисты получаются в том числе и из тех, кто не следовал хорошим традициям. Существует функция <code>defined()</code>, которая проверяет, определена ли константа:
 
<source lang="php">
Строка 248 ⟶ 267 :
== Операторы ==
=== Математические операторы ===
В '''PHP''', как и в любом другом языке программирования, есть базовый набор математических операторов:
{| class="wikitable"
*'''Унарный минус''' (<code>-</code>) — изменяет знак числа;
!Оператор
*'''Сложение, вычитание, умножение''' (<code>+</code>, <code>-</code>, <code>*</code>) — действуют так же, как и в обычной математике;
!Операция
*'''Деление''' (<code>/</code>) — всегда возвращает вещественное число (т.е. с типом данных <code>float</code>), вне зависимости от результата;
!Примечания
*'''Деление по модулю''' (<code>%</code>) — возвращает остаток от деления.
|-
|<code>-</code>
|Смена знака числа.
|
|-
|<code>-</code>
|Вычитание.
|
|-
|<code>+</code>
|Сложение.
|
|-
|<code>*</code>
|Умножение.
|
|-
|<code>/</code>
|Деление.
|Всегда возвращает тип <code>float</code>, вне зависимости от результата.
|-
|<code>%</code>
|Деление по модулю.
|Возвращает остаток от деления.
|}
 
=== Инкремент и декремент ===
*Возвращают старое значение $a:
**<code>$a++</code> — увеличиваетувеличить $a на 1;
**<code>$a--</code> — уменьшаетуменьшить $a на 1.
*Возвращают новое значение $a:
**<code>++$a</code> — увеличиваетувеличить $a на 1;
**<code>--$a</code> — уменьшаетуменьшить $a на 1.
 
=== Операторы сравнения ===
Строка 275 ⟶ 319 :
| <code>$a === $b</code>
|Идентично
| '''$a''' равно '''$b''' и они имеют одинодного и тоттого же типтипа.
|-
| <code>$a != $b</code> или <code>$a <> $b</code>
Строка 291 ⟶ 335 :
| <code>$a >= $b</code>
|Больше или равно
| '''$a''' или больше, или равно '''$b'''.
|-
| <code>$a <= $b</code>
|Меньше или равно
| '''$a''' или меньше, или равно '''$b'''.
|}
 
Строка 311 ⟶ 355 :
 
=== Поразрядные операторы ===
Эта группа операторов работает с битовыми представлениями значений целочисленных операндов. В основном, эти операторы применяются для создания набора булевых флагов.:
{| class="wikitable"
|'''Оператор'''
|'''Операция'''
|-
| <code>&</code> || Поразрядная конъюнкция (AND).
|-
| <code><nowiki>|</nowiki></code> || Поразрядная дизъюнкция (OR).
|-
| <code>^</code> || Поразрядное исключающее ИЛИ (XOR).
|-
| <code>~</code> || Поразрядное отрицание (NOT).
|-
| <code><nowiki><<</nowiki></code> || Сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда.
Строка 341 ⟶ 387 :
</source>
 
=== Операторы ветвления алгоритмов (if… elseif… else…) ===
=== if…elseif…else ===
Оператор <code>if</code> позволяет выполнять определённый код только при выполнении определённого условия:
<source lang="php">
Строка 363 ⟶ 409 :
</pre>
 
Для того, чтобы выполнять код только если условие не выполнилось, можно использовать блок <code>else</code>:
<source lang="php">
<?php
Строка 371 ⟶ 417 :
</source>
 
Можно использовать инструкцию <code>elseif</code> (англ. «иначе, если»):
<source lang="php">
<?php
Строка 380 ⟶ 426 :
</source>
 
=== Переключатель (switch) ===
<source lang="php">
<?php
Строка 396 ⟶ 442 :
?>
</source>
ДанныйВышенаписанный пример выведет: «Переменная имеет значение „A“». И этоти примерто аналогиченже следующий пример:
<source lang="php">
<?php
Строка 407 ⟶ 453 :
 
=== Операторы цикла ===
Операторы цикла задают многократное исполнение операторов в теле цикла. В '''PHP''' определены 4 разных оператора цикла:
*циклЦикл с предусловием: <code>while(condition) { statements; }</code>
*циклЦикл с постусловием: <code>do { statements; } while(condition);</code>
*итерационныйИтерационный цикл: <code>for(expression1; expression2; expression3) { statements; }</code>
*итерационныйИтерационный цикл <code>foreach</code> (т.е. перебор элементов массива): <code>foreach(array as [$key =>] $value) { statements; }</code>
 
Если 3 первых оператора цикла берут своесвоё начало от "[[C++|С]]"-подобных языков, то последний оператор позаимствован у языка "[[Perl]]".
 
==== while ====
Оператор <code>while</code> называется оператором цикла с предусловием. При входе в цикл вычисляется выражение условия, и, если его значение отлично от нуля, выполняется тело цикла. Затем вычисления выражения условия и операторов тела цикла выполняется до тех пор, пока значение выражения условия не станет равным нулю. Оператором <code>while</code> удобно пользоваться для просмотра всевозможных последовательностей, если в конце них находится заранее известный символ. (Это очень удобно в "[[C++]]", к примеру, для определения длины строки, поскольку в "[[C++|С++]]", по определению, строка есть последовательность символов типа "char", заканчивающаяся нулевым символом: <code>\0</code>).
 
Пример простейшего цикла <code>while</code>:
<source lang="php">
<?php
Строка 429 ⟶ 475 :
Этот код выдает в окне браузера цифры от одного до пяти.
 
Для выхода из цикла применяется оператор <code>break</code>. При обнаружении этого оператора текущая итерация цикла прекращается, и последующиевсе итерации не происходятпрекращаются. ПриПример: при выполнении следующегонижеприведённого примерацикла, несмотря на то, что переменная <code>$var = 7</code>, в окне браузера появятся цифры от «1»—«5», доисключая 5.«6» и «7»:
<source lang="php">
<?php
Строка 442 ⟶ 488 :
</source>
 
ИногдаЧтобы бываетперейти нужнов прервать только текущуюследующую итерацию, и перейти сразу к следующей. Для этого применяется оператор <code>continue</code>:
<source lang="php">
<?php
Строка 455 ⟶ 501 :
</source>
 
В этом примере выводятся цифры от «1 до »—«7», кромеза цифрыисключением «5».
 
Заметим, что если выВы поставитерасположите условный оператор после операторов <code>echo</code>, код будет ошибочным, и(т.к. выведутся все цифры, отвключая 1 до 7«5»), поскольку проверка условия выхода из цикла на данной итерации, будет происходить уже после полного выполнения этой итерации.
 
Бесконечный цикл реализуется при помощи оператора <code>while</code> следующим образом:
<source lang="php">
while(true)
Строка 467 ⟶ 513 :
</source>
 
''Примечание:'' В '''PHP''', стандартное время исполнения скрипта — 30 секунд (эту настройку можно изменить в файле "php.ini"). То есть; по его прошествии 30 секунд с начала выполнения скрипта, его действие скрипта будет прервано. Таким образом, наибольшее время выполнения «бесконечного» цикла  (без изменения настроек) — полминуты.
 
==== do…whiledo… while… ====
Этот оператор называется оператором цикла с постусловиемпост-условием. При входе в цикл, в любом случае выполняется тело цикла (то есть цикл ''всегда'' будет выполнен хотя бы один раз),; затем вычисляется условие, и если оно не равно «0», то вновь выполняется тело цикла и проверка условия. В нижеследующем примере — «нуль» всегда будет добавлен в список, независимо от условия <code>(++$i <= $var)</code>:
<source lang="php">
<?php
Строка 488 ⟶ 534 :
</source>
 
Цикл с постусловием бывает полезен при обработке некоторых последовательностей, когда обработку нужно заканчивать не «до», а «после» появления концевого признака.
 
Бесконечный цикл реализуется так:
Строка 508 ⟶ 554 :
</source>
 
Здесь <code>expression1</code> (инициализация цикла) — последовательность определений и выражений, разделяемая запятыми. Все выражения, входящие в инициализацию, вычисляются только один раз, при входе в цикл. Как правило, здесь устанавливаются начальные значения счетчиковсчётчиков и параметров цикла. Смысл выражения-условия <code>expression2</code> такой же как и у циклов с предусловиями.; Припри отсутствии выражения-условия предполагается, что его значение всегда истинно. Выражения <code>expression3</code> вычисляются в конце каждой итерации после выполнения тела цикла.
 
В следующем скрипте, мы по традиции выведем числа от «0» до «5»:
<source lang="php">
<?php
Строка 521 ⟶ 567 :
</source>
 
Результат аналогичен, показанному надля предыдущем«do… рисункеwhile…».
 
==== foreach ====
Оператор цикла <code>foreach</code> предназначен для работы с элементами массива. Следующий код превратит все элементы массива в единицы.:
<source lang="php">
<?php
Строка 536 ⟶ 582 :
</source>
 
Также предусмотрена возможность работы с ассоциативными массивами. При обработке следующего кода, в переменной <code>$name</code> будет храниться ассоциативный индекс элемента, а в переменной <code>$value</code> — его значение. Проще говоря, <code>($arr[$name] == $value)</code>.
<source lang="php">
<?php
Строка 546 ⟶ 592 :
</source>
 
=== Тернарный оператор «?» :» ===
Тернарный оператор «'''?:'''» это вид условного оператора,. В случае с записью вида <code>Выражение «1» ? Выражение «2» : Выражение «3»</code> — он проверяет Выражение «1», и если оно верно, то присваиваеттернарный оператор возвращает значение Выражения «2,»; иначе — Выражения «3».
<source lang="php">
<?php
Строка 554 ⟶ 600 :
$c = 11;
$d = 10;
$f = $a ? $c : $d; // Переменной $f присвоится значение переменной $c, т. к. значение выражения $a истинно
$gf = $ba ? $c : $d; //# Здесь наоборот -Переменной $gf будет присвоеноприсвоится значение переменной $dc,
# т. к. значение выражения $a истинно.
$h = (!empty($n)) ? $n : $c+$d; // Сперва проверится существование переменной $n, а т. к. она не существует, переменной $h присвоится сумма $c и $d, т. е. 21
$g = $b ? $c : $d; # Здесь наоборот: $g будет присвоено значение $d,
# т. к. значение выражения $b ложно.
$h = (!empty($n)) ? $n : $c + $d; # Сперва проверится существование
# переменной $n. Т. к. она не существует,
# переменной $h присвоится
# сумма $c и $d, т. е. "21".
?>
</source>
 
== Строковые функции PHP ==
Несмотря на то, что эта глава написана скорее в духе справочника, материал, изложенный в ней, достаточно серьезенсерьёзен, хотя и не самый сложный для понимания. Умение грамотно работать со строками очень важно для программиста. Строковых функций в '''PHP''' немало, причем многие из них, так или иначе, просто дублируют друг друга. Однако, приемыприёмы работы с основными блоками функций (функции поиска и замены в тексте, функции удаления пробельных символом (trim-функции), функции форматного вывода) надо представлять очень четкочётко.
 
''Вообще говоря, по определению, строка — это последовательность символов типа '''char''', которая заканчивается нулевым символом. Поэтому, можно, конечно, радоваться тому, что при работе со строками, нам не приходится жонглировать указателями в стиле "C"/"[[C++]]", однако не стоит забывать о том, что цена этому удобству — быстродействие. Поэтому некоторые приводимые здесь функции мы будем обсуждать в том числе и с точки зрения их быстродействия.''
 
=== Функция "htmlspecialchars" ===
<code>string htmlspecialchars(string $str)</code>
 
Эта функция преобразовывает некоторые специальные символы [[HTML]] в другой формат. При этом они будут отображаться без учетаучёта их специального назначения.
 
'''Пример'''
 
корректноеКорректное формирование и вывод гиперссылки, содержащей определённые параметры:
<source lang="php">
$link_search_subject = "Экранирование";
Строка 583 ⟶ 637 :
</source>
 
заметьтеЗаметьте, что следующий (ниже представленный) код, содержит грубое нарушение, так как формирует гиперссылку с атрибутом, содержащим незаконченную (не закрытую) ссылку на сущность (&…;) :
 
<source lang="php">
Строка 595 ⟶ 649 :
</source>
 
этоЭто довольно часто встречаемая ошибка.
 
=== Функции поиска в тексте ===
 
==== substr() ====
Функция '''<code>substr()</code>''' возвращает часть строки. Например:
Например:
<source lang="php">
echo substr('Simple text', 3, 7);
</source>
 
Где 3 — точка отсчетаотсчёта, а 7 — длина изымаемой строки. Если же требуется вести отсчетотсчёт от конца строки, используйте отрицательное значение.
 
'''Пример'''
 
Эта функция разобьетразобьёт число по трём разрядам:
<source lang="php">
<?php