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

918 байт добавлено ,  1 год назад
м
<source> -> <syntaxhighlight> (phab:T237267)
м (<source> -> <syntaxhighlight> (phab:T237267))
 
'''PHP''' предоставляет несколько методов для вставки комментариев. Проще всего пользоваться двойной косой чертой (//), после чего '''PHP'''-машина игнорирует всё, что расположено до конца строки. Также можно пользоваться многострочными комментариями в стиле "C" / [[C++|"С++"]] (/*…*/). Для однострочных комментариев можно ещё пользоваться символом решётки (#) (комментарий сценарных языков операционной системы [[UNIX|"UNIX"]]).
 
<sourcesyntaxhighlight lang="php">
<?php
print '<p>Hello</p>'; // Комментарий
*/
?>
</syntaxhighlight>
</source>
 
Следует помнить о том, что стили комментариев '''PHP''' действуют только внутри ограничителей '''PHP'''. Если '''PHP''' встретит эти символы комментариев вне ограничителей, то они, как и любой текст, будут помещены на HTML-страницу. Например:
 
<sourcesyntaxhighlight lang="php">
<?php
print '<p>Hello</p>'; //Нормальный комментарий.
?>
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="html5">
// А вот этот комментарий отобразится браузером.
<!-- Комментарий HTML. Будет виден в исходном коде HTML, но не в браузере. -->
</syntaxhighlight>
</source>
 
== Переменные ==
|}
Есть функция <code>gettype()</code>, возвращающая тип, который '''РНР''' назначил переменной:
<sourcesyntaxhighlight lang="php">
<?php
$var1 = '5';
. gettype($var2); # Будет возвращено: "integer".
?>
</syntaxhighlight>
</source>
 
Существует также функция <code>settype()</code>, которая явно устанавливает тип:
 
<sourcesyntaxhighlight lang="php">
<?php
$var = '5';
echo '<br />' . gettype($var); # Будет возвращено: "integer".
?>
</syntaxhighlight>
</source>
 
Кроме функции <code>settype()</code>, преобразование типов в '''РНР''' можно осуществлять при помощи операторов преобразования типов. Преобразование типов осуществляется путём указания перед переменной её нового типа, взятого в скобки:<sourcesyntaxhighlight lang="php">
$var = (integer)$var;
</syntaxhighlight>
</source>
 
Соответственно, выполнение следующего кода приведёт к тому, что '''РНР''' вернёт «''integer»'':
<sourcesyntaxhighlight lang="php">
<?php
$var = '5'; # Изначально, создаётся переменная типа "string" (строковая).
echo gettype($var); # Отображаем окончательный тип переменной: "integer".
?>
</syntaxhighlight>
</source>
 
=== Внешние переменные ===
 
Затем '''РНР''' заполняет переменную <code>$_GET[]</code>, являющуюся ассоциативным массивом, которая создаётся при анализе строки запроса. Строка запроса хранится в элементе массива <code>$_SERVER['QUERY_STRING']</code> и представляет собой информацию, следующую за символом «?» в запрошенном URL. '''РНР''' разбивает строку запроса по символам «&»<ref>Символ разделения также может меняться в файле ''php.ini''. Часто используется символ «;».</ref> на отдельные элементы, а затем ищет в каждом из этих элементов знак «=». Если знак «=» найден, то создаётся переменная с именем из символов, стоящих слева от знака равенства. Рассмотрим следующую форму:
<sourcesyntaxhighlight lang="html5">
<!DOCTYPE html>
<html>
</body>
</html>
</syntaxhighlight>
</source>
 
Если Вы сохраните этот фрагмент кода в виде HTML-файла и откроете его в веб-браузере, то увидите форму ввода. Если в строке «HDD» набрать какой-либо текст (к примеру, ''«''Maxtor»), и также в строке «CD-ROM» (например, «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") как с обычными переменными; в нашем случае — они просто выводятся на экран:
 
<sourcesyntaxhighlight lang="php">
<?php
echo "<p>HDD is " . $_GET['HDD'] . "</p>";
echo "<p>CDROM is " . $_GET['CDROM'] . "</p>";
?>
</syntaxhighlight>
</source>
 
Если запрос страницы выполняется при помощи метода <code>POST</code>, то появляется группа ''POST''-переменных, которые интерпретируются так же и помещаются в массив <code>$_POST[]</code>.
== Константы ==
Константы объявляются в '''РНР''' при помощи функции <code>define()</code>:
<sourcesyntaxhighlight lang="php">
define('CONSTANT', value)
</syntaxhighlight>
</source>
 
Первый параметр этой функции — имя константы, второй — её значение. При использовании константы на неё ссылаются по имени:
<sourcesyntaxhighlight lang="php">
<?php
define('CONSTANT1', 15);
echo CONSTANT3;
?>
</syntaxhighlight>
</source>
 
По традиции имена констант пишут буквами верхнего регистра. И хотя это только традиция, мы рекомендуем Вам следовать ей, поскольку «плохие» программисты получаются в том числе и из тех, кто не следовал хорошим традициям. Существует функция <code>defined()</code>, которая проверяет, определена ли константа:
 
<sourcesyntaxhighlight lang="php">
<?php
define('CONSTANT', 'Hello');
if(defined('CONSTANT')) echo '<p>CONSTANT is defined</p>';
?>
</syntaxhighlight>
</source>
 
== Операторы ==
=== Операторы присвоения ===
Для присвоения переменной нового значения используется оператор «<code>=</code>»:
<sourcesyntaxhighlight lang="php">
$a = $b + $c - 127;
</syntaxhighlight>
</source>
Также существуют сокращённые операторы присвоения: <code>+=</code>, <code>-=</code>, <code>.=</code>, <code>/=</code>, <code>*=</code>, <code>%=</code>. Пример:
<sourcesyntaxhighlight lang="php">
$a = $a + 1;
#равносильно
$a += 1;
</syntaxhighlight>
</source>
 
=== Поразрядные операторы ===
|}
 
<sourcesyntaxhighlight lang="php">
<?php
echo (4<<2); //16
echo (6^5); //3
?>
</syntaxhighlight>
</source>
 
=== Операторы ветвления алгоритмов (if… elseif… else…) ===
Оператор <code>if</code> позволяет выполнять определённый код только при выполнении определённого условия:
<sourcesyntaxhighlight lang="php">
<?php
$a = 1;
if($a < $c) echo "\$a < \$c;<br />";
?>
</syntaxhighlight>
</source>
 
Этот код выводит следующие строки:
 
Чтобы выполнять код, только если условие не выполнилось — можно использовать блок <code>else</code>:
<sourcesyntaxhighlight lang="php">
<?php
if(isset($_GET['test'])) echo 'Query contains "test" parameter';
else echo 'Query doesn\'t contain "test" parameter';
?>
</syntaxhighlight>
</source>
 
Можно использовать инструкцию <code>elseif</code> (англ. «иначе, если»):
<sourcesyntaxhighlight lang="php">
<?php
if($_GET['test'] == "foo") echo 'test = "foo"';
else echo 'Query doesn\'t contain "test" parameter';
?>
</syntaxhighlight>
</source>
 
=== Переключатель (switch) ===
<sourcesyntaxhighlight lang="php">
<?php
$a = "A";
}
?>
</syntaxhighlight>
</source>
Вышенаписанный пример выведет: «Переменная имеет значение „A“» — и то же выведет следующий пример:
<sourcesyntaxhighlight lang="php">
<?php
$a = "A";
else echo "Ответ не найден";
?>
</syntaxhighlight>
</source>
 
=== Операторы цикла ===
 
Пример простейшего цикла <code>while</code>:
<sourcesyntaxhighlight lang="php">
<?php
$var = 5;
while(++$i <= $var) echo $i . '<br />';
?>
</syntaxhighlight>
</source>
 
Этот код выдает в окне браузера цифры от одного до пяти.
 
Для выхода из цикла применяется оператор <code>break</code>. При обнаружении этого оператора все итерации прекращаются. Пример: при выполнении нижеприведённого цикла — несмотря на то, что переменная <code>$var = 7</code> — в окне браузера появятся цифры «1»—«5», исключая «6» и «7»:
<sourcesyntaxhighlight lang="php">
<?php
$var = 7;
}
?>
</syntaxhighlight>
</source>
 
Чтобы перейти в следующую итерацию применяется <code>continue</code>:
<sourcesyntaxhighlight lang="php">
<?php
$var = 7;
}
?>
</syntaxhighlight>
</source>
 
В этом примере выводятся цифры «1»—«7», за исключением «5».
 
Бесконечный цикл реализуется при помощи оператора <code>while</code> следующим образом:
<sourcesyntaxhighlight lang="php">
while(true)
{
...
}
</syntaxhighlight>
</source>
 
''Примечание:'' в '''PHP''' стандартное время исполнения скрипта — 30 секунд (эту настройку можно изменить в файле "php.ini"); по его прошествии с начала выполнения скрипта действие скрипта будет прервано. Таким образом, наибольшее время выполнения «бесконечного» цикла (без изменения настроек) — полминуты.
==== do… while… ====
Этот оператор называется оператором цикла с пост-условием. При входе в цикл в любом случае выполняется тело цикла (то есть цикл ''всегда'' будет выполнен хотя бы один раз); затем — вычисляется условие, и если оно не равно «0», то вновь выполняется тело цикла и проверка условия. В нижеследующем примере — «нуль» всегда будет добавлен в список, независимо от условия <code>(++$i <= $var)</code>:
<sourcesyntaxhighlight lang="php">
<?php
$var = 5;
while(++$i <= $var);
?>
</syntaxhighlight>
</source>
 
Результат:
<sourcesyntaxhighlight lang="html5">
0<br />1<br />2<br />3<br />4<br />5<br />
</syntaxhighlight>
</source>
 
Цикл с постусловием бывает полезен при обработке некоторых последовательностей — когда обработку нужно заканчивать не «до», а «после» появления концевого признака.
 
Бесконечный цикл реализуется так:
<sourcesyntaxhighlight lang="php">
do
{
}
while(true);
</syntaxhighlight>
</source>
 
==== for ====
Как уже говорилось, итерационный цикл имеет следующий формат:
 
<sourcesyntaxhighlight lang="php">
for(expression1; expression2; expression3) {
statements;
}
</syntaxhighlight>
</source>
 
Здесь <code>expression1</code> (инициализация цикла) — последовательность определений и выражений, разделяемая запятыми. Все выражения, входящие в инициализацию, вычисляются только один раз, при входе в цикл. Как правило, здесь устанавливаются начальные значения счётчиков и параметров цикла. Смысл выражения-условия <code>expression2</code> — такой же как и у циклов с предусловиями; при отсутствии выражения-условия предполагается, что его значение всегда истинно. Выражения <code>expression3</code> вычисляются в конце каждой итерации после выполнения тела цикла.
 
В следующем скрипте мы по традиции выведем числа от «0» до «5»:
<sourcesyntaxhighlight lang="php">
<?php
$var = 5;
}
?>
</syntaxhighlight>
</source>
 
Результат аналогичен показанному для «do… while…».
==== foreach ====
Оператор цикла <code>foreach</code> предназначен для работы с элементами массива. Следующий код превратит все элементы массива в единицы:
<sourcesyntaxhighlight lang="php">
<?php
$arr = array(1, 2, 3, 4);
}
?>
</syntaxhighlight>
</source>
 
Также предусмотрена возможность работы с ассоциативными массивами. При обработке следующего кода в переменной <code>$name</code> будет храниться ассоциативный индекс элемента, а в переменной <code>$value</code> — его значение. Проще говоря, <code>($arr[$name] == $value)</code>.
<sourcesyntaxhighlight lang="php">
<?php
...
}
?>
</syntaxhighlight>
</source>
 
=== Тернарный оператор «?:» ===
Тернарный оператор «'''?:'''» — это вид условного оператора. В случае с записью вида <code>Выражение «1» ? Выражение «2» : Выражение «3»</code> — он проверяет Выражение «1», и если оно верно, то тернарный оператор возвращает значение Выражения «2»; иначе — Выражения «3».
<sourcesyntaxhighlight lang="php">
<?php
$a = true;
# сумма $c и $d, т. е. "21".
?>
</syntaxhighlight>
</source>
 
== Строковые функции PHP ==
 
Корректное формирование и вывод гиперссылки, содержащей определённые параметры:
<sourcesyntaxhighlight lang="php">
$link_search_subject = "Экранирование";
$link_label = "Поиск по слову " . "$link_search_subject";
."&go=".urlencode("Перейти")).'">'.htmlspecialchars($link_label).
'</a>';
</syntaxhighlight>
</source>
 
Заметьте, что следующий (ниже представленный) код содержит грубое нарушение, так как формирует гиперссылку с атрибутом, содержащим незаконченную (не закрытую) ссылку на сущность (&…;) :
 
<sourcesyntaxhighlight lang="php">
$link_search_subject = "Экранирование";
 
"Поиск по слову Экранирование".
'</a>';
</syntaxhighlight>
</source>
 
Это довольно часто встречаемая ошибка.
==== substr() ====
Функция '''<code>substr()</code>''' возвращает часть строки. Например:
<sourcesyntaxhighlight lang="php">
echo substr('Simple text', 3, 7);
</syntaxhighlight>
</source>
 
Где «3» — точка отсчёта, а «7» — длина изымаемой строки. Если же требуется вести отсчёт от конца строки — используйте отрицательное значение.
 
Эта функция разобьёт число по трём разрядам:
<sourcesyntaxhighlight lang="php">
<?php
function my_int($value)
echo my_int(12345678); //=> 12 345 678
</syntaxhighlight>
</source>
 
Для работы с разными кодировками используется функция:
 
Эта функция определяет модель браузера:
<sourcesyntaxhighlight lang="php">
<?php
function get_current_browser() {
get_current_browser();
?>
</syntaxhighlight>
</source>
 
==== strrpos() ====
 
Эта функция достаёт из [[w:URL|URL]] имя файла ('''только пример;''' в жизни, можно использовать функцию <code>basename()</code>):
<sourcesyntaxhighlight lang="php">
function getfname($url)
{
return $filename; // Возвращаем: или результат обработки, или ''.
}
</syntaxhighlight>
</source>
 
==== strstr(), stristr() ====
 
'''Пример:'''
<sourcesyntaxhighlight lang="php">
<?php
print strstr('www.wikibooks.org', '.'); // Результат: ".wikibooks.org".
?>
</syntaxhighlight>
</source>
 
Для работы с разными кодировками используются функции:
 
'''Пример:'''
<sourcesyntaxhighlight lang="php">
<?php
print = strrchr('www.wikibooks.org', '.'); // Результат: ".org".
?>
</syntaxhighlight>
</source>
 
==== substr_count() ====
 
'''Пример:'''
<sourcesyntaxhighlight lang="php">
<?php
print substr_count('www.wikibooks.org', 'o'); // Результат: "3".
?>
</syntaxhighlight>
</source>
 
==== strspn() ====
 
'''Пример:'''
<sourcesyntaxhighlight lang="php">
<?php
return strspn("42 is the answer; what is the question?",
// является сегмент "42", -- длиной в 2 символа.)
?>
</syntaxhighlight>
</source>
 
==== strcspn() ====
# Введённые пользователем данные;
# Результат хеш-функции от пароля.
<sourcesyntaxhighlight lang="html5">
<!DOCTYPE html>
<html>
</head>
<body>
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="php">
<?php
// Register
}
?>
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="html5">
</body>
</html>
</syntaxhighlight>
</source>
 
=== Авторизация пользователя ===
#Закрытие сессии методом перенаправления на другую страницу. - ''header (Location: ...);''
===== '''Форма входа''' =====
<sourcesyntaxhighlight lang="php">
<?php
session_start();
# он будет работать в любом случае.
?>
</syntaxhighlight>
</source>
<sourcesyntaxhighlight lang="html5">
<form action="session.php" method="POST">
<p>
<input type="submit" value="Вход" />
</form>
</syntaxhighlight>
</source>
 
====='''Сессия (session.php)'''=====
<sourcesyntaxhighlight lang="php">
<?php
 
header('Location: http://deskside/main.php?page=home');
?>
</syntaxhighlight>
</source>
 
=== Вывод данных пользователя ===
Проще всего будет просто выводить шаблон на страницу ('''$login_form''').<br />
====='''Пользователь авторизировался'''=====
<sourcesyntaxhighlight lang="php">
if ($_COOKIE['user_enter']){
 
 
}
</syntaxhighlight>
</source>
 
====='''Пароли не совпали'''=====
<sourcesyntaxhighlight lang="php">
if($_COOKIE['user_login'] == "no_enter"
And $_COOKIE['user_enter'] == false){
';
}
</syntaxhighlight>
</source>
 
====='''Форма авторизации'''=====
<sourcesyntaxhighlight lang="php">
$login_form = '
<table>
</table>
';
</syntaxhighlight>
</source>
 
== Примечания ==
583

правки