Собственные (пользовательские) функции в PHP. Часть 1

"Все аспекты самостоятельного создания и продвижения сайтов
от практика с многолетним опытом." — блог Рудь Сергея
info@site-on.net
Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!
23.05.2014

Всем добрый день. Сегодняшней статьёй мы продолжаем погружаться в недра PHP, но не только. В конце данной статьи вы найдёте кроссворд, разгадав который вы можете получить от 500 до 1500 рублей. Все подробности тут, а мы продолжаем учиться.

Что такое функция?

Функция – это участок кода, который можно многократно выполнять в различных местах PHP скрипта (нашей страницы).

Синтаксис:

function siteOn(){
    // тело функции
    echo 'Привет всем читателям блога Site on!';
}

Где siteOn – это произвольное имя функции, оно регистро-независимое. Функция в примере выше выводит заданный текст. Когда PHP интерпретатор обрабатывает код, он видит только объявление функции, без её тела, и естественно, не выполняет его. Тело функции храниться в памяти до завершения работы PHP скрипта, то есть до конца загрузки страницы.

После написания функции наша задача сводится к тому, чтобы вызывать её в нужных нам местах. Вот как это делается:

<?php

function siteOn(){
    echo 'Привет всем читателям блога Site on!<br />';
}

siteOn(); // вызов функции
siteOn(); // вызов функции
siteOn(); // вызов функции

?>

В примере выше мы вызвали функцию аж 3 раза, и вот результат:

вызов

Зачем нужны функции?

Казалось бы, ну функция и что? Мы могли бы эту строчку просто написать 3 раза и без функции. Могли, но если мы вдруг захотим что-то поменять в этом фрагменте, то менять нам придётся всего в одном месте, а не в трёх. Но это ещё не всё! Сейчас мы рассмотрели простой вариант, когда всё рядом и в одном файле. В жизни же в файле может быть тысячи строк, и раскиданы они могут быть хаотично по всему файлу.

Одно дело зайти и поменять всё в одной функции, другое дело менять в 10 местах да ещё и искать по всему файлу. Но и это не всё! Сайты не состоят из одного файла, какой-нибудь фрагмент кода нам мог бы пригодиться в десятках различных файлов, и нам пришлось бы искать все повторения этого кода кучу времени. Благодаря функциям мы знаем, что, например, все функции мы храним в таком-то файле, зайду туда, и поменяю один раз.

То есть можете взять себе такое правило: если какой-то участок кода будет повторяться, то обязательно делаем из него функцию!

Проверка на существование

В PHP нельзя 2 раза объявить одну и туже функцию. К примеру, если написать:

<?php

function siteOn(){
    // любой код или без него
}

function siteOn(){
    // любой код или без него
}

?>

То получим следующую ошибку. Кстати, запоминайте все типичные ошибки:

Fatal error:

Cannot redeclare siteOn() (previously declared in Z:\home\custom\www\index.php:3) in Z:\home\custom\www\index.php on line 9

В этой ошибке указано, что мы уже объявляли такую функцию, и даже указано в каком именно файле и строке мы это уже делали. Обращаю ваше внимание, что в PHP встроенных функций несколько тысяч, поэтому такая ситуация может запросто возникнуть у вас при разработке.

Чтобы узнать, существует уже такая функция или нет, вы можете использовать встроенную функцию function_exists(). Пример:

<?php

function siteOn(){
    // любой код или без него
}

if(function_exists('siteOn')){
    echo 'Такая функция уже есть!';
}

?>

Результат:

Лично я никогда не использую эту функцию, но знать вы о ней должны.

Аргументы функций

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

<?php

function siteOn($author){
    echo $author . ' - автор блога Site on!';
}

?>

В примере выше аргумент функции это переменная $author. Как его можно использовать? При вызове функций, мы можем передавать внутрь неё значение аргумента. Это придаёт нашим функциям небывалую гибкость и динамику:

<?php

function siteOn($author){
    echo $author . ' - автор блога Site on!<br />';
}

siteOn('Сергей'); // первый способ

$name = 'Андрей'; // второй способ
siteOn($name);

siteOn(); // ничего не передаём

?>

Результат:

Как видите, когда мы не передали аргумент, мы получили ошибку типа Warning, после которой исполнение нашего PHP скрипта всё равно продолжилось дальше. Опять таки ошибка содержит очень подробную информацию о том, где всё это произошло. Warning - это серьёзная ошибка, и игнорировать её нельзя.

Функция может иметь сколько угодно аргументов, например:

<?php

function siteOn($author, $blog){
    echo $author . ' - автор блога '. $blog .'<br />';
}

siteOn('Сергей', 'Site on!'); // первый способ

$name = 'Андрей'; // второй способ
siteOn($name, 'Сладкоешка');

siteOn('Фёдор Иванов'); // передали только 1 аргумент

?>

Результат:

Нестандартный вызов функций

Немного тонкостей. Следующим способом вызова функций обычно никто не пользуется, и вам я так делать тоже не советую, но знать вы о нём должны. Смотрим:

<?php

function siteOn($author, $blog){
    echo $author . ' - автор блога '. $blog .'<br />';
}

$text = 'siteOn'; // заносим в переменную имя функции
$text('Сергей', 'Site on!'); // вызываем функцию через переменную

?>

Результат будет каким и обычно:

Практический пример использования функций

Помните таблицу умножения из предыдущей статьи? Там у нас есть 2 параметра: количество строк и количество столбцов, которые мы задаём в переменных. Самое время сделать из того кода целую функцию, которая будет принимать два вышеперечисленный значения!

Весь код из предыдущего урока я оставлю неизменным, разве что теперь нам больше не придётся задавать в нём количество строк и столбцов, мы это будем делать при вызове функции:

<?php

function getTable($rows, $cols){
   // закомментировали эти 2 строки, так как количество теперь передаётся при вызове функции
   // $rows = 20; // количество строк, tr
   // $cols = 20; // количество столбцов, td

    $table = '<table border="1">';

    for ($tr=1; $tr<=$rows; $tr++){
        $table .= '<tr>';
        for ($td=1; $td<=$cols; $td++){
            if ($tr===1 or $td===1){
                $table .= '<th style="color:white;background-color:green;">'. $tr*$td .'</th>';
            }else{
                $table .= '<td>'. $tr*$td .'</td>';
            }
        }
        $table .= '</tr>';
    }

    $table .= '</table>';
    echo $table;
}

getTable(3,3); // выводим таблицу умножения 3 на 3
getTable(5,5); // выводим таблицу умножения 5 на 5
getTable(10,10); // выводим таблицу умножения 10 на 10

?>

Результат:

Аргументы по умолчанию

При создании функции мы можем задать произвольным аргументам значения по умолчанию. Аргументы, у которых есть значения по умолчанию можно не указывать при вызове функции и это не будет ошибкой. Потому что вместо пропущенного аргумента функция автоматически подставит значение по умолчанию. Пример:

<?php

function siteOn($author, $blog='Site on!'){
    echo $author . ' - автор блога '. $blog .'<br />';
}

siteOn('Сергей');

?>

В этом примере мы аргументу $blog присвоили значение по умолчанию Site on! После чего вызвали функцию всего с одним аргументом, а второй использовал своё значение по умолчанию.

Результат:

Важно:

аргументы по умолчанию обязательно записываются последними.

Другими словами: обязательные аргументы (без значения по умолчанию) слева направо должны идти первыми, далее за ними идут аргументы, которые имеют значение по умолчанию.

Как в примере выше, сначала в круглых скобочках я записал обязательный аргумент $author, затем необязательный аргумент $blog. Аргумент $blog я назвал необязательным, так как у него есть значение по умолчанию.

На сегодня, я считаю, достаточно, советую попробовать написать свои функции, которые будут принимать различные аргументы. В следующей статье мы продолжим тему изучения функций в PHP, а теперь предлагаю всем немного развлечься и при этом заработать, блеснув эрудицией!

Кроссворд №1

Итак, я постарался сделать кроссворд не из самых лёгких, так как считаю своих читателей людьми образованными и смышлёными, а такие люди не нуждаются в поддавках. Ещё раз напоминаю, что все подробности об участии в конкурсе по разгадыванию кроссвордов находятся тут. Скажу только, что победитель получит славу, золото и женщин обратную ссылку на его (или её) сайт.

Желаю удачи!

У Вас либо старый браузер, либо отключена поддержка Javascript.
Работа кроссворда невозможна.
С уважением, .
Пожалуйста, оцените эту статью
Средняя оценка: 4.95 из 5 (проголосовало: 20)
Статья оказалась вам полезной? Подпишитесь, чтобы не пропустить новые!

Ваш email:
Вы можете помочь развитию проекта, сделав всего 1 клик:
Спасибо!
Пожалуйста, прокомментируйте, как Вам моя статья?
Имя:
Комментарий:

Если Вы хотите вставить код, пожалуйста, заключайте его в [code][/code]

Подписаться на новые комментарии:

E-mail:


Защита от спама: у треугольника три...
Ответ:
Подписаться на новые комментарии без комментирования - Email:
Защита от спама: у треугольника три...
Ответ:

25.05.2014 21:45:50 Юрий Йосифович:
Кросворд розгадал, отправил автору :)
На счет самой публикации по php - довольно интересная реализация, вот только как реализовать для магазина Virtuemart (и стоит ли...) незнаю. Возьму на заметку.

Ответить на комментарий


29.07.2015 17:09:27 Alex:
Сергей, статья хорошая, но не хватает информации, например как динамически сгенерировать таблицу с объединенными ячейками.
Вот это было бы очень интересно.

Ответить на комментарий

Использую для работы
Мои расширения
Свежие статьи
Рекомендую
Горячо обсуждаемые
Подписка
  • Следовать в twitter:
  • Подписаться по RSS:
  • Подписаться по E-mail:
  • Следить ВКонтакте:
  • Следить на Facebook:
Пользовательское соглашение об условиях использования сайта и Политика конфиденциальности
Перепечатывание или копирование материалов сайта (текста, изображений и другого содержимого) для их публичного или коммерческого использования в сети Интернет, либо в печатных изданиях строго запрещены. При нарушении данного правила, с нашей стороны будут предприняты соответствующие меры, вплоть до судебной жалобы.
© site-on.net
Шрифт: +стандартно-