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

Материал из Викиучебника — открытых книг для открытого мира
Содержимое удалено Содержимое добавлено
Нет описания правки
Отмена правки № 21309 участника 89.232.244.79 (обсуждение)
Строка 1: Строка 1:
'''PHP''' (произносится ''пи-эйч-пи́'' или ''пэ-хэ-пэ'') — [[w:скриптовый язык|скриптовый язык]] программирования, созданный для генерации [[w:HTML|HTML]]-страниц на [[w:веб-сервер|веб-сервер]]е и работы с [[w:база данных|базами данных]]. Ныне поддерживается подавляющим большинством представителей [[w:хостинг|хостинг]]ов. Входит в [[w:LAMP|LAMP]] — «стандартный» набор для создания [[w:вебсайт|вебсайт]]ов.
'''PHP''' (произносится ''пи-эйч-пи́'') — [[w:скриптовый язык|скриптовый язык]] программирования, созданный для генерации [[w:HTML|HTML]]-страниц на [[w:веб-сервер|веб-сервер]]е и работы с [[w:база данных|базами данных]]. Ныне поддерживается подавляющим большинством представителей [[w:хостинг|хостинг]]ов. Входит в [[w:LAMP|LAMP]] — «стандартный» набор для создания [[w:вебсайт|вебсайт]]ов.


== PHP программы ==
== PHP программы ==

Версия от 20:26, 24 мая 2007

PHP (произносится пи-эйч-пи́) — скриптовый язык программирования, созданный для генерации HTML-страниц на веб-сервере и работы с базами данных. Ныне поддерживается подавляющим большинством представителей хостингов. Входит в LAMP — «стандартный» набор для создания вебсайтов.

PHP программы

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

Дело в том, что на PHP, как правило, используется сугубо для программирования приложений, связанных с Интернетом. Однако, PHP можно еще использовать в качестве интерпретатора командной строки, в основном в *nix-системах. Последнее возможно при помощи CORBA и COM интерфейсов, а также при помощи расширения PHP-GTK. При таком использовании PHP возможно решение следующих задач:

  • создание приложений интерактивной командной строки;
  • создание кросс-платформенных GUI приложений при помощи библиотеки PHP-GTK;
  • автоматизация некоторых задач под Windows и Linux

Рассмотрим процесс выполнения php-сценария при обращении броузера к серверу. Итак, вначале броузер запрашивает страницу с расширением .php, после чего web-сервер пропускает программу через машину PHP и выдаёт результат в виде html-кода. Причем, если взять стандартную страницу HTML, изменить расширение на .php и пропустить её через машину PHP, последняя просто перешлёт её пользователю без изменений. Чтобы включить в этот файл команды PHP, необходимо заключить команды PHP в специальные теги, которых различают 4 вида (они эквивалентны и можно использовать любые):

1. Инструкция обработки XML:

<?php
...
?>

2. Инструкция обработки SGML:

<?
...
?>

3. Инструкция обработки сценариев HTML:

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

4. Инструкция в стиле ASP:

<%
...
%>

Мы будем придерживаться стиля XML или SGML.

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

<?php
if (5<3) {
  echo("<p>Hello, world!<p>");
?>
<p>Hello!</p>
// эта строка не интерпретируется как код PHP
// и выводится только если  блок кода выполняется
<?
  echo("<p>Hello, world!<p>");
}
?>

Команда echo в PHP применяется для вывода фактически всего, что встречается на web-страницах (текст, разметку HTML, числа). Смысл ее действия, мы думаем, понятен из приведенного примера.

Комментарии

PHP предоставляет несколько методов для вставки комментариев. Проще всего пользоваться двойным слэшем (//), после чего PHP машина игнорирует все, что расположено до конца строки. Также можно пользоваться многострочными комментариями в стиле С (/*…*/). Для однострочных комментариев можно еще пользоваться символом решетки (#) (комментарий скриптовых языков UNIX).

<php
echo("<p>Hello</p>"); // комментарий
echo("<p>Hello</p>"); # комментарий
/** 
 * и это тоже комментарии
 */
?>

Следует помнить о том, что стили комментариев PHP действуют только внутри ограничителей PHP. Если PHP встретит эти символы комментариев вне ограничителей, то они, как и любой текст, будут помещены на html-страницу. Например:

<php
echo("<p>Hello</p>"); // нормальный комментарий
?>
// а вот этот комментарий отобразится броузером.
<!-- Комментарий  HTML. Будет виден в исходном коде HTML, но не в браузере  --> 

Заметим, что комментарии можно вставлять не только после конца оператора, а, например, и вот так:

<?php
$a = "Hello, world";
echo strstr($a,"H");
// эту функцию мы рассмотрим позднее
?>

Переменные

В РНР переменные начинаются со знака доллара ($). За этим знаком может следовать любое количество буквенно-цифровых символов и символов подчеркивания, но первый символ не может быть цифрой или подчеркиванием. Следует также помнить, что имена переменных в РНР чувствительны к регистру, в отличие от ключевых слов.

При объявлении переменных в РНР не требуется явно указывать тип переменной, при этом одна и та же переменная может иметь на протяжении программы разные типы.

Переменная инициализируется в момент присваивания ей значения и существует до тех пор, пока выполняется программа. Т.е., в случае web-страницы это означает, что до тех пор, пока не завершен запрос.

Внешние переменные

После того, как запрос клиента проанализирован веб-сервером и передан РНР машине, последняя устанавливает ряд переменных, которые содержат данные, относящиеся к запросу и доступны все время его выполнения. Сначала РНР берет переменные окружения Вашей системы и создает переменные с теми же именами и значениями в окружении сценария РНР для того чтобы сценариям, расположенным на сервере были доступны особенности системы клиента. Эти переменные помещаются в ассоциативный массив $HTTP_ENV_VARS (подробнее о массивах можно узнать в главе 4).

Естественно, что переменные массива $HTTP_ENV_VARS являются системно зависимыми (поскольку это фактически переменные окружения). Посмотреть значения переменных окружения для Вашей машины Вы можете при помощи команды env (Unix) или set (Windows).

Затем РНР создает группу GET-переменных, которые создаются при анализе строки запроса. Строка запроса хранится в переменной $QUERY_STRING и представляет собой информацию, следующую за символом "?" в запрошенном URL. РНР разбивает строку запроса по символам & на отдельные элементы, а затем ищет в каждом из этих элементов знак "=". Если знак "=" найден, то создается переменная с именем из символов, стоящих слева от знака равенства. Рассмотрим следующую форму:

<form action = "http://localhost/PHP/test.php" method="get">
  HDD: <input type="text" name="HDD"/><br>
  CDROM: <input type="text" name="CDROM"/><br>
  <input type="submit"/>
</form>

Если Вы в этой форме в строке HDD наберете, к примеру, "Maxtor", а в строке CDROM "Nec", то она сгенерирует следующую форму запроса: http://localhost/PHP/test.php?HDD=Maxtor&CDROM=Nec

В нашем случае РНР создаст следующие переменные: $HDD = "Maxtor" и $CDROM = "Nec".

Вы можете работать с этими переменными из Вашего скрипта (у нас – test.php) как с обычными переменными. В нашем случае они просто выводятся на экран:

<?php
echo("<p>HDD is $HDD</p>");
echo("<p>CDROM is $CDROM</p>");
?>

Если запрос страницы выполняется при помощи метода POST, то появляется группа POST-переменных, которые интерпретируются также и помещаются в массив $HTTP_POST_VARS.

Константы

Константы объявляются в РНР при помощи функции define():

define(CONSTANT, value)

Первый параметр этой функции – имя константы, второй – её значение. При использовании константы на неё ссылаются по имени:

<?php
  define(CONSTANT1,15);
  define(CONSTANT2,"\x20"); // код пробела
  define(CONSTANT3,"Hello");
  echo(CONSTANT1);
  echo(CONSTANT2);
  echo(CONSTANT3);
?>

По традиции имена констант пишут буквами верхнего регистра. И хотя это только традиция, мы Вам рекомендуем ей следовать, поскольку плохие программисты получаются в том числе и из тех, кто не следовал хорошим традициям J. Существует функция defined(), которая проверяет, определена ли константа:

<?php
define(CONSTANT,"Hello");
if (defined("CONSTANT")) {
  echo("<p>CONSTANT is defined</p>");
}
?>


Типы данных в РНР.

Преобразование типов

Как уже было сказано, PHP предоставляет определенную гибкость в отношении типов переменных, т.е. с одной и той же переменной на протяжении программы можно работать и как со строкой, и как с числом. Однако, несмотря на это в РНР существуют набор основных типов данных, которые могут явно указываться при работе с переменными:

  • integer;
  • string;
  • boolean;
  • double;
  • array;
  • object;

Есть функция gettype(), возвращающая тип, который РНР назначил переменной:

<?php
$var = "5";
$var1 = 5;
echo (gettype($var));
echo "<br>";
echo (gettype($var1));
?>

В первом случае РНР вернет string, во втором integer.

Существует также функция settype(), которая явно устанавливает тип:

<?php
$var = "5";
echo(gettype($var));
settype($var,integer);
echo "<br />";
echo(gettype($var));
?>

Выполнение этого фрагмента кода приведет к такому же результату, как и предыдущего.

Кроме функции settype() преобразование типов в РНР можно осуществлять при помощи операторов преобразования типов. Преобразование типов осуществляется путем указания перед переменной ее нового типа, взятого в скобки:

$var = (int)$var; 

Соответственно, выполнение следующего кода приведет к тому, что РНР вернет integer:

<?
$var = "5"; // тип string
$var = (int)$var; // преобразуем в int
echo(gettype($var));
?>

Операторы

if...else

Переключатель switch

Операторы цикла

Операторы цикла задают многократное исполнение операторов в теле цикла. В PHP определены 4 разных оператора цикла:

  • цикл с предусловием: while (condition) { statements; }
  • цикл с постусловием: do { statements; } while(condition);
  • итерационный цикл: for (expression1;expression2;expression3) { statements; }
  • итерационный цикл foreach: foreach (array as [$key =>] $value) { statements; }

Если 3 первых оператора цикла берут свое начало от С-подобных языков, то последний оператор позаимствован у языка Perl (кстати, цикл foreach мы разберем попозже – в главе 4, посвященной массивам).

While

Оператор while называется оператором цикла с предусловием. При входе в цикл вычисляется выражение условие, и, если его значение отлично от нуля, выполняется тело цикла. Затем вычисления выражения условия и операторов тела цикла выполняется до тех пор, пока значение выражения условия не станет равным нулю. Оператором while удобно пользоваться для просмотра всевозможных последовательностей, если в конце них находится заранее известный символ. (Это очень удобно в C++, к примеру для определения длины строки, поскольку в С++, по определению, строка есть последовательность символов типа char, заканчивающаяся нулевым символом).

Пример простейшего цикла while:

<?php
$var = 5;
$i = 0;
while (++$i <= $var) {
  echo($i); echo('<br />');  
}
?>

Этот код выдает в окне браузера цифры от одного до пяти.

Для выхода из цикла применяется оператор break. При обнаружении этого оператора текущая итерация цикла прекращается, и последующие итерации не происходят. При выполнении следующего примере, несмотря на то, что переменная $var = 7, в окне браузера появятся цифры от 1 до 5.

<?php
$var = 7;
$i = 0;
while (++$i <= $var) {
  echo($i);
  echo('<br>');
  if($i==3)break;
}
?>

Иногда бывает нужно прервать только текущую итерацию, и перейти сразу к следующей. Для этого применяется оператор continue:

<?php
$var = 7;
$i = 0;
while (++$i <= $var) {
  if ($i==5) {
    continue;
  }
  echo($i);
  echo('<br>');
}
?>

В этом примере выводятся цифры от 1 до 7, кроме цифры 5.

Заметим, что если Вы условный оператор поставите после операторов echo, код будет ошибочным, и выведутся все цифры от 1 до 20, поскольку проверка условия выхода из цикла на данной итерации, будет происходить уже после выполнения этой итерации.

Бесконечный цикл реализуется при помощи оператора while следующим образом:

while(1) {
  ...
}

Это тоже самое, что и запись while(true).

Do…while

Этот оператор называется оператором цикла с постусловием. При входе в цикл в любом случае выполняется тело цикла (т.е. цикл всегда будет выполнен хотя бы один раз), затем вычисляется условие, и если оно не равно 0, вновь выполняется тело цикла. В нижеследующем примере ноль всегда будет добавлен в список, независимо от условия (++$i <= $var):

<?php
$var = 5;
$i = 0;
do {
  echo($i); echo('<br>');   
}
while (++$i <= $var)
?>

Результат:
1
2
3
4
5

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

Бесконечный цикл реализуется так:

do ; while(1);

For

Как уже говорилось, итерационный цикл имеет следующий формат:

for (expression1;expression2;expression3) {
  statements;
}

Здесь expression1 (инициализация цикла) – последовательность определений и выражений, разделяемая запятыми. Все выражения, входящие в инициализацию, вычисляются только один раз при входе в цикл. Как правило, здесь устанавливаются начальные значения счетчиков и параметров цикла. Смысл выражения-условия (expression2) такой же как и у циклов с пред- и постусловиями. При отсутствии выражения-условия предполагается, что его значение всегда истинно. Выражения expression3 вычисляются в конце каждой итерации после выполнения тела цикла.

В следующем скрипте, мы по традиции выведем числа от 0 до 5:

<?php
$var = 5;
$i = 0;
for ($i = 0; $i <= $var; $i++) {
  echo($i);
  echo('<br>');
}
?>

Результат аналогичен, показанному на предыдущем рисунке.

Бесконечный цикл можно организовать следующим образом:

for(;;);

Строковые функции PHP

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

Вообще говоря, по определению, строка – это последовательность символов типа char, которая заканчивается нулевым символом. Поэтому, можно, конечно, радоваться тому, что при работе со строками, нам не приходится жонглировать указателями в стиле C/C++, однако не стоит забывать о том, что цена этому удобству – быстродействие. Поэтому некоторые приводимые здесь функции мы будем обсуждать в том числе и с точки зрения их быстродействия.

Функция htmlspecialchars

Функции поиска в тексте

substr()

Функция substr() возвращает часть строки. Например:

echo substr('Simple text', 3,7);

Где 3 - точка отсчета, а 7 - длина изымаемой строки. Если же требуется вести отсчет от конца строки, используйте отрицательное значение.

Пример

Эта функция разобьет число по трём разрядам:

function my_int($int){
   $last3 = substr($int, strlen($int) - 3, 3);
   if(strlen($int)<=3){return $last3;} 
   else{return my_int(substr($int, 0, strlen($int)-3)).' '.$last3;}
}

echo my_int(123456789); //=> 123 456 789

strpos()

Возвращает позицию первого вхождения подстроки

int strpos (string haystack, string needle [, int offset])

Возвращает позицию первого вхождения подстроки needle в строку haystack.

Если подстрока needle не найдена, strpos() возвращает FALSE.

Пример:

Эта функция определяет модель браузера:

function getCurrentBrowser() {
   $browser = $_SERVER['HTTP_USER_AGENT'];
   if(strpos(strtoupper($browser), 'MSIE')!==false){return "Internet Explorer";} 
   elseif(strpos(strtoupper($browser), 'FIREFOX')!==false){return "Firefox";} 
   elseif(strpos(strtoupper($browser), 'KONQUEROR')!==false){return "Konqueror";} 
   elseif(strpos(strtoupper($browser), 'LYNX')!==false){return "Lynx";} 
   else{return $browser;}
}

strrpos()

Возвращает позицию последнего вхождения символа

int strrpos (string haystack, string needle [, int offset])

Возвращает позицию последнего вхождения needle в строку haystack. В PHP 4 используется только первый символ строки needle.

Если подстрока needle не найдена, возвращает FALSE.


Пример:

Эта функция достаёт из URL имя файла

function getfname($url){
    $pos=strrpos($url, '/');
    if ($pos === false){return false;}// имени файла нет
	else {
        $len = strlen($url);
        if ($len<$pos){print $len.'/'.$pos; return false;} 
		else {$filename=substr($url, $pos+1, $len-$pos-1);}
    }
    return $filename;
}

strstr()

strchr()

stristr()

strrchr()

substr_count()

strspn()

strcspn()

Ссылки