Решил запостить материал по поводу пользовательских функций для новичков которые только осваивают PHP.
Весь код имеет ознакомительный характер... И не может быть использован в реальном проекте так как отсутствует защита от хулиганов :)
В любом языке программирования существуют подпрограммы. В языке C они называются функциями, в ассемблере - подпрограммами, а в Pascal существуют даже два вида подпрограмм: процедуры и функции.
Подпрограмма - это специальным образом оформленный фрагмент программы, к которому можно обратиться из любого места внутри программы. Подпрограммы существенно упрощают жизнь программистам, улучшая читабельность исходного кода, а также сокращая его, поскольку отдельные фрагменты кода не нужно писать несколько раз
В PHP такими подпрограммами являются пользовательские функции.
Помимо встроенных функций PHP, часто возникает необходимость создания пользовательских функций, выполняющих определенные задачи.
//Простая пользовательская функция
function helloWorld()
{
//Объявляем переменную типа string
$str = 'Привет мир';
//Возвращаем значение функции
return $str;
}
//Вызываем нашу функцию
echo helloWorld() .'<br>'; //Выведет Привет мир
Теперь усложним нашу функцию передав ей какой нибудь параметр
function showString($str)
{
//Возвращаем значениее функции
return $str;
}
//Нашим параметром будет строка в переменной string
$string = 'Я люблю PHP';
//Теперь вызываем нашу функцию showString
echo showString($string) .'<br>'; //Вывидет Я люблю PHP
Передавать параметры в функцию можно сколько угодно $a, $b, $n
Параметры отделяются друг от друга запятой.
//Рассмотрим пример передавая несколько параметров в функцию
function calc($a, $b)
{
//Прибовляем значения $a + $b
$result = $a + $b;
//Выводим результат
return $result;
}
echo calc(5, 5) .'<br>';//Результат = 10
Теперь давайте усложним нашу функцию и напишем простой калькулятор
function calculator($a, $b, $action)
{
//Используем конструкцию SWITCH
switch($action)
{
case "+":
$res = $a + $b;
break;
case "-":
$res = $a - $b;
break;
case "*":
$res = $a * $b;
break;
case "/":
if($a == 0 or $b == 0)
$err = 'На ноль делить нельзя';
else
$res = $a / $b;
break;
}
//Если ошибок нет то выводим результат
if(empty($err))
return $res;
else
return $err;
}
//Проверяем была ли нажата кнопка РАССЧИТАТЬ
if(isset($_POST['submit']))
{
//Передаем аргументы функции для ее обработки
echo calculator($_POST['a'], $_POST['b'], $_POST['action']) .'<br>';
}
//Форма калькулятора
echo "
<form method='POST'>
<input type='text' name='a'><br>
<select name='action' size='1'>
<option value='+'>+</option>
<option value='-'>-</option>
<option value='*'>*</option>
<option value='/'>/</option>
</select><br>
<input type='text' name='b'><br>
<input type='submit' name='submit' value='Рассчитать'><br>
</form>";
И так давайте смотреть работу нашего скрипта.
У нас есть форма, есть обработчик этой формы и есть вызов обработчика формы.
Сначала мы проверяем, была ли нажата кнопка формы пользователем, для этого нам поможет функция ISSET. Если данное условие верно то выполняется действие в нутрии конструкции IF. После этого мы передаем аргументы нашей функции, а именно первое число, второе число и то действие которое выбрали из SELECT (+,-,*,/).
После того как передали аргументы функции интерпретатор возвращается на строчку где у нас описывается сама функция function calculator(); и начинает обработку полученных аргументов. Получив результат работы функции мы его возвращаем с помощью конструкции RETURN.
Инструкция GLOBAL в пользовательских функциях.
$text = 'Я люблю PHP.';
function showText()
{
//Объявляем глобальную переменную внутри тела функции
global $text;
//Начальная строка текста
$str = 'Меня зовут Вася.';
//С помощью конкатенации склеиваем наши строки в одну строку.
$str = $str .' '. $text;
return $str;
}
echo showText() .'<br>'; //Вывод - Меня зовут Вася. Я люблю PHP.
Рассмотрим функцию showText(). Данной функции не было передано ни одного аргумента, но была передана переменная из скрипта не находящегося в теле функции. Это возможно благодаря директивы GLOBAL именно она позволяет нашей функции увидеть нашу переменную за пределами нашей функции. Если бы ее не было, то мы бы получили результат функции (Меня зовут Вася.).
Надеюсь, что Вы догадались, что GLOBAL это глобальный точнее определяет что переменная у нас теперь глобальная и видна из любого места нашего скрипта. В теле функции можно объявить сколько угодно глобальных переменных через запятую global $a, $b, $n.
Инструкция STATIC в пользовательских функциях
Рассмотрим функцию showNumeric(). В теле данной функции находится статическая переменная $num данная переменная видна только в теле функции. Вы спросите в чем разница данной переменной от просто переменной в теле функции ведь их тоже не видно за пределами функции.
function showNumeric()
{
//Объявляем статическую переменную
static $num;
//Инкриментируем ее
$num++;
//Возвращаем значение функции
return $num;
}
//Прогоняем вызов функции 10 раз
for ($i = 0; $i <= 9; $i++)
echo showNumeric();
Давайте рассмотрим пример действия функции с данной переменной.
Результат данных действия будет разный.
В первом варианте функция выведет нам 1 2 3 4 5 6 7 8 9 10
Если убрать директиву STATIC то результат работы функции будет такой 1 1 1 1 1 1 1 1 1 1.
Это связано с тем что переменная после вызова функции в цикле обнуляется.
Пользовательские функции параметры по умолчанию
Параметры по умолчанию – это когда вы определяете переменную как аргумент функции в функции для дальнейшей обработки параметров.
Простой пример:
//Функция с параметром по умолчанию
function varDefault($num = 10)
{
//Возвращаем значение
return $num;
}
//Проверяем ЕСЛИ функция возвращает 10 ТО выводи сообщение что функция вернула 10
if(varDefault() == 10)
echo 'Функция вернула число 10 <br>';
else
echo 'Функция не равна 10 <br>';
//ВЫВЕДЕТ: Функция вернула число 10
//А если написать так
if(varDefault(5) == 10)
echo 'Функция вернула число 10 <br>';
else
echo 'Функция не равна 10 <br>';
//ВЫВЕДЕТ: Функция не равна 10
Давайте разбираться по чему так происходит. Дело в том что мы задали параметр по умолчанию равному 10, согласно нашему первому условию он верно (ИСТИНА), что и демонстрирует эта часть кода. Второй части кода мы заменяем параметр нашей функции на 5 и тогда наше условии не выполняется (ЛОЖЬ).
Возможно с первого не понять для чего это вообще нужно и где это можно применить. Давайте попробуем смоделировать ситуацию, создадим функцию которая будет выводить меню на сайте (по умолчанию пользователя, если нужно то админа.
//Создаем массив ссылок
$link = array(
'Главная' => 'index.php',
'Новости' => 'news.php',
'О нас' => 'about.php',
'Форум' => 'forum.php'
);
//Определяем константы для формирования путей для ссылок
define('ADMIN_MENU', '/admin/');
define('HOST', 'http://'.$_SERVER['HTTP_HOST']);
function menu($link, $flag = false)
{
//Создаем пустой массив для с генерированых ссылок
$arr_link = array();
//Проверяем какое будет меню (ПОЛЬЗОВАТЕЛЬ / АДМИН)
if($flag === true)
$menu = ADMIN_MENU;
else
$menu = '/';
//Перебераем массив с данными для ссылок
foreach($link as $k => $v)
//Записываем все ссылки в массив
$arr_link[] = "<a href='".HOST.$menu.$v."'>". $k ."</a>\n";
//Возвращаем ссылки в виде массива
return $arr_link;
}
//Выводим результат работы скрипта (меню)
echo join('<br>', menu($link)) ."<br><br>\n"; //Меню ПОЛЬЗОВАТЕЛЯ
echo join('<br>', menu($link, true)) ."<br>\n"; //Меню АДМИНА
Если мы не передаем второй аргумент функции, то параметр функции остается по умолчанию, если мы укажем второй параметр TRUE, то выведем меню админа, так как мы изменили параметр по умолчанию.
Это всего лишь пример как можно применить параметр в функции по умолчанию, все зависит от вашей фантазии.
Таблица – ВЫВОД ЗЕБРОЙ (функция для новичка)
Довольно часто форумчане, особенно новички спрашиваю, как вывести таблицу зеброй. Вот как раз на этом примере я вам покажу удобства работы с пользовательскими функциями.
//Создаем массив с данными от 1 до 10
$data = range(1,10);
//Функция заливки таблицы
function bgColorTable($num)
{
//Первый цвет заливки строки таблицы
$bg = '#c0c0c0';
if(++$num % 2 == 0)
//Второй цвет заливки строки таблицы
$bg = '#ffffd0';
//Возвращаемый цвет заливки строки таблицы
return $bg;
}
//Рисуем саму таблицу
$tbl = "<table border='0' width='50%'>\n";
//Определяем переменную для инкремента
$i = 0;
//Перебираем массив с данными и вставляем в ячейки таблицы
foreach($data as $val)
{
$tbl .= "<tr bgcolor='". bgColorTable($i++). "'>\n";
$tbl .= "<td>". $val ."</td>\n";
$tbl .= "</tr>\n";
}
$tbl .= "</table>\n";
//Выводим сгенерированную таблицу
echo $tbl;
Мы создали функцию которая отвечает за генерацию цвета строки ячеек в таблицы. Теперь когда нам нужно в таблицу вывести зеброй мы всего лишь на всего вызываем нашу функцию. Если нужно изменить цвета, то мы лишь в одном месте меняем их , в теле функции, а не бегаем судорожно по страницам с кодом и исправляем везде. Согласитесь, удобней поменять значения параметра в одном месте, чем искать их в разных местах.
Это не весь материал о пользовательских функция, так что ждите продолжения...