На сегодняшнем уроке мы разберём самую, пожалуй, важную тему, относящуюся к PHP (а, впрочем, и к другим языкам программирования). Сегодня мы очень серьёзно будем рассматривать функции.
Что же такое?..
Объясню на примере: представим, что нам понадобилось сделать страницу, в которой выводился список — имя и фотография сотрудника фирмы. То есть, как минимум, код каждого сотрудника был бы примерно таким:
Пример 1. Примерный код описания сотрудника:
<html>
<head>
<title>Сотрудники нашей фирмы</title>
</head>
<body>
<p><img src='foto/ivanov.jpg' width='100px' height='150px' align=left>
Имя: <b>Иванов Иван Иванович</b>
<br>Ответственный и профессиональный сотрудник, знающий своё дело.
<p><img src='foto/petrov.jpg' width='100px' height='150px' align=left>
Имя: <b>Петров Пётр Петрович</b>
<br>Сотрудник, способный прекрасно справляться со своей работой.
<p><img src='foto/maksimov.jpg' width='100px' height='150px' align=left>
Имя: <b>Максимов Максим Максимович</b>
<br>Вполне обычный сотрудник фирмы. Ничего выдающегося.
</body>
</html>
А теперь представьте, что на странице должна быть указана информация о двух-трёх сотнях сотрудников! Код будет огромен! А главное, здесь будет неудобно использовать include() — имена-то, фотографии и характеристики разные.
Что делать?
И на помощь нам приходят функции! Что такое функция? Функция — это участок (фрагмент) кода, который используется или может использоваться во время выполнения скрипта неоднократно.
В PHP есть тысячи готовых функций,
но увы, порой их возможностей не хватает для наших суровых необходимостей. Поэтому мы всегда можем создать собственную функцию, чтобы использовать её в своих скриптах.
Как создать свою функцию
У всех функций есть единый общий вид. Он примерно такой:
Пример 2. Общий вид функции:
function ИМЯ_ФУНКЦИИ ($ПАРАМЕТР_1, $ПАРАМЕТР_2, $ПАРАМЕТР_3, ...) {
КОД_ФУНКЦИИ
}
Поясняю: ИМЯ_ФУНКЦИИ — это, как Вы наверное поняли, имя функции. В PHP не может существовать двух функций с одним и тем же именем!
После имени функции в скобках указываются параметры функции. Параметров может быть сколько угодно. Что такое параметр функции? Порой, чтобы функция могла что-то сделать ей нужны какие-нибудь начальные значения, с которыми она будет работать. Это и есть параметры.
Код функции находится внутри фигурных скобок ( { и } ).
Ну, а теперь вернёмся к примеру
с сотрудниками фирмы. Если раньше нам пришлось бы вручную вписывать каждого сотрудника, то с использованием функций мы легко можем решить задачу. Вот посмотрите на следующий код:
Пример 3. Изменённый с использованием функций первый пример:
<html>
<head>
<title>Сотрудники нашей фирмы</title>
</head>
<body>
<?
function sotrudnik($name, $foto, $text) {
// создаём новую функцию с именем sotrudnik
// и параметрами: $name — имя сотрудника,
// $foto — фотография сотрудника
// $text — характеристика сотрудника
// А теперь просто вызываем созданную функцию:
sotrudnik ("foto/ivanov.jpg", "Иванов Иван Иванович",
"Ответственный и профессиональный сотрудник, знающий своё дело.");
sotrudnik ("foto/petrov.jpg", "Петров Пётр Петрович",
"Сотрудник, способный прекрасно справляться со своей работой.");
sotrudnik ("foto/maksimov.jpg", "Максимов Максим Максимович",
"Вполне обычный сотрудник фирмы. Ничего выдающегося.");
?>
</body>
</html>
Пожалуйста! Теперь нам не нужно повторять код вывода картинки, и другой HTML-код — всё это сделает за нас функция sotrudnik().
Заметьте: при вызове функций третий параметр ($text) я перенёс на следующую строку. Не волнуйтесь, это вполне нормальное явление. Вы точно также можете переносить параметры функций для удобства чтения кода.
Получаемое результатов
Подчас функция должна не только выполнить какие-то действия, но и вернуть нам результат этих действий. Если результатом должен стать HTML-код, который нужно вывести на экран, то тут всё просто — в самой функции мы используем конструкции echo() и сразу из функции выводим результаты на экран. Но что если функция не должна выводить результат работы на экран, а должна вернуть его программе для дальнейших операций с этим полученным значением?
Возвращение результата
работы функции делается с помощью оператора return. Его формат таков:
Пример 4. Формат оператора return:
function ИМЯ_ФУНКЦИИ (ПАРАМЕТРЫ) {
КОД_ФУНКЦИИ
return РЕЗУЛЬТАТ;
}
Во всём этом коде нас интересует только строка возврата значения. Результатом может выступать какая-нибудь переменная, конкретное число или текст.
Во всех известных мне учебниках по PHP всегда приводится пример функции вычисляющей квадрат числа. Думаю, чтоит и мне его привести здесь:
Пример 5. Функция «Квадрат числа»
<?php function square($x) {
$y = $x * $x;
// переменная $y теперь содержит $x в квадрате
return $y;
// возвращаем значение $y
// после команды return никакие другие команды функции
// не выполняются
}
$kv=square(15);
// здесь вызывается функция square, которая получает
// в качестве значения $x число 15
// возвращаемое функцией значение записывается
// в переменную $kv
echo ($kv);
// и эта переменная выводится на экран ?>
Кстати, вместо двух строк функции ( $y = ... и return $y ) можно было использовать только одну: return $x * $x. Тогда PHP сначала вычислил бы произведение, а потом вернул бы нам результат.
Пример 5. Пример скрипта «Дата и время» из второй чашечки:
<p>Дата и время:
<p><?php
$d=date("d.m.Y H:i");
echo($d);
?>
Обратите внимание на третью строку:
$d=date("d.m.Y H:i");
Вот Вам ещё один пример функции. Только уже функции, встроенной в PHP. Это функция date(). Её предназначение — вывод даты и времени в определённом формате. В этой строке date
— это имя функции, а "d.m.Y H:i" — это строковый параметр, который передаётся функции. Результат работы функции записывается в переменную $d, которая потом и выводится.
Значения по-умолчанию
Порой мы можем прямо при определении функции указать значения некоторых её параметров. Вот, например:
Пример 6. Значения функции по-умолчанию:
<?php function bestLang
( $language = "PHP") {
echo ("Лучший язык на свете — ");
echo ($language);
echo ("<br>");
}
bestLang();
bestLang("Perl"); ?>
Как будет действовать PHP: при первом вызове функции bestLang() параметр не указан, значит будет выведено значение по-умолчанию — PHP. Во втором случае программист явно указал в качестве параметра $language слово Perl и будет выведено именно оно. Результат показан
на рисунке 1.
Рисунок 1. Результат работы примера 6
При использовании аргументов функции со значениями по-умолчанию стоит помнить две вещи:
Значение, которое указывается по умолчанию должно быть константой. То есть, нельзя указывать, например, такие значения: function bla ( $var = date()) { ... } или function bla ( $var = $x ) { ... }
Сначала
указываются аргументы функции без значений по-умолчанию, потом — со значениями по умолчанию. Ошибочный вариант: function bla ( $var=1, $x ) { … }. Правильный вариант: function bla ( $x, $var=1 ) { … }
Область видимости переменных
Область видимости является краеугольным камнем многих языков программирования. PHP в этом плане просто как валенок. Что такое область определения? Это тот участок кода скрипта, в котором переменная «видна».
Все переменные,
которые были определены вне функции имеют глобальную область видимости. Те, которые были определены внутри — локальную область видимости. Что это значит? Посмотрим на пример:
Пример 7. Глобальная область видимости переменной:
<?php $a = 1;
// мы определили переменную $a
// она имеет глобальную область видимости, т.к. была
// определена вне всяких функций
function test() {
echo ($a);
// переменная $a была определена вне всяких
// функций, а значит внутри функции не видна
// и её значение внутри функции неизвестно
}
test();
// вызвав функцию мы не получим результата — внутри
// функции переменная не видна ?>
А вот другой пример:
Пример 8. Локальная область видимости переменной:
<?php function test() {
$a=1;
// определяем переменную $a внутри функции
}
test();
echo ($a);
// результата мы также не получим, потому что
// переменная была определена внутри функции и
// вне её значение переменной неизвестно ?>
Если Вам нужно «увидеть» переменную, определённую вне функции, внутри её, то Вы должны использовать ключевое слово global. Вот пример наглядно показывающий такое применение:
Пример 9. Способ «увидеть» внутри функции переменную, объявленную вне её:
<?php $a=1;
$b=2;
$c=0;
function test() {
global $a, $b, $c;
$c = $a + $b;
}
test();
echo ($c);
// результат — 3. Всё работает. ?>
Этот пример совершенно бесполезен: каждый раз при вызове функция test() создаёт «внутри» себя переменную $a, присваивает ей нулевое значение, выводит это значение и увеличивает его на единицу. Вот только увеличивание ничего не даёт: при выходе из функции переменная будет удалена.
Статическая переменная — это переменная, которая сохраняет
своё значение между разными вызовами одной функции.
Теперь, каждый раз при вызове функция test() будет выводить значение $a и увеличивать его. Чтобы лучше понять, как это действует, давайте разберём действия PHP по шагам:
При первом вызове функции test(), PHP создаёт переменную $a и присваивает ей нулевое значение.
Потом он выводит значение $a — ноль на экран
и увеличивает значение на 1.
При втором вызове переменная $a уже известна, а потому ещё раз она не будет создана.
PHP выведет текущее значение — единицу и снова увеличит это значение на 1.
Последующие вызовы функции действуют также: пропускают создание переменной (она уже создана), выводят значение и увеличивают его на 1.
Учитывая объём всей информации я советую Вам постараться полностью разобраться со всеми аспектами работы с функциями. А для улучшения результатов предлагаю
Вам несколько заданий по функциям:
Помните, в пятой чашечке я показывал пример создания таблицы умножения (пример 11)? Задача: сделать универсальную функцию, которая выводила бы такую таблицу. Функция должна принимать два параметра: начальное и конечное значение в таблице.
Сделать функцию, которая получает число от 1 до 10 и возвращает результат проверки: простое ли это число. Напомню: число называется простым если оно делится нацело только на само себя
и на единицу.
Написать функцию, которая находит сумму целых чисел от 1 до N (N объявляется вне функции).
Все результаты присылайте на мой e-mail: eugene@phpbook.com.ru, если будут какие-то вопросы — пишите туда же.