🧙Конкурс сказок!
Уроки PHP
(OFF) gjm2mjg (B) 22 окт 2016

Функции

Знакомство с этой темой открывает возможности написать хоть сколько-то полезный скрипт. Заинтригованы? - Приступаем!
Понятие функций пришло в программирование, как и в принципе всё, из математики. Суть вопроса вот в чем. Допустим, часто приходится работать с несколькими большими формулами, причем одна из них может использовать несколько других... В итоге вся эта писанина займет очень много места и будет отвлекать от сути. Поэтому некоторые известные формулы указывают их именем, по которому можно понять их назначение. Вот очень простой пример, но я надеюсь Вы уловите суть. Однажды мне по работе на ландшафтном дизайне нужно было разместить на участке два пластиковых бордюра для деревьев, которые отделяют газон от дерева. Два бордюра уже были установлены, и между ними нужно было вставить еще два. Расстояние между ними было 10 метров, окружность одного круга 5.3 м., и вот каким был мой ход мыслей:
(10 - ((5.3 / 3.14) * 2)) / 3
5.3 / 3.14 = 1.7 м. - узнаем диаметр одного круга
1.7 * 2 = 3.4 м. - размер, занимаемый двумя кругами
10 - 3.4 = 6.6 м. - свободное пространство, которое останется после установки кругов
6.6 / 3 = 2.2 м. - между четырьмя кругами должно быть три пустых участка, и это их размер.
Вот вам и небольшая формула. Если бы она была частью нескольких других, возможно еще больших формул, представляете как это путало бы?
Если бы эта формула находилась в функции, которая принимает только один параметр - количество кругов - и возвращает расстояние между кругами, то выглядеть она могла бы примерно так: len(x) - где x - количество кругов. Теперь если бы эта формула использовалась бы в других, читающим их не пришлось бы заморачиваться с рассчетом расстояния между кругами и можно было бы сосредоточиться на более важных вопросах, рассчитывая что на месте len(x) будет стоять необходимое число.
ЯП, в частности PHP тоже умеют работать с функциями, и сейчас мы рассмотрим их подробней.
Функция в ЯП - это фрагмент программного кода, который выполняет некоторую работу. В PHP очень много стандартных функций, и вот несколько из них для примера:

Строковые
strrev($text) - переворачивает строку $text
strlen($text) - длина текста $text в символах
trim($text) - обрезает пробелы в начале и в конце текста $text
....

Продолжать примеры мне, честно говоря, лень. Лучше подойдем к вопросу о том, как ними пользоваться,
Здесь хочу сделать небольшое отступление для принятия с Вами некоторого соглашения. В предыдущих примерах я, для лучшего понимания Вами, сохранял некоторое значение в переменной, и только потом работал с этим значением. Так делать не есть хорошо, и теперь я буду показывать примеры кода несколько иначе, и Вы привыкайте делать так же! Вспомните из предыдущих уроков, что на месте переменной стоит подразумевать её значение! Так что теперь вместо:

<?php

$x = 5;
$y = 2;
$z = ($x * $y);

echo $z;
...мы, чтобы не заниматься ерундой, будем писать так:

<?php

echo (5 * 2);
Теперь небольшой пример реального использования функции и затем я снова немного по умничаю:

<?php

$text1 = 'Hello';
$text2 = strrev($text1);

echo $text1 . '<br>';
echo $text2
Снова пример в старом стиле. Надеюсь, это последний раз.
Итак, что мы получим в результате? На странице в одной строке будет написано 'Hello', на второй 'olleH'.
Hello
olleH
Теперь немного по умничаю. Одна из тонкостей функций, которую ОЧЕНЬ ВАЖНО ПОНИМАТЬ, что функция может возвращать значение, а может и не возвращать. Функция из предыдущего примера, как и большинство других, возвращает значение, которое сохраняется в переменной $text2 и затем выводится на страницу. Это раз! Функция может принимать параметры (или, как еще говорится аргументы - это одно и то же), а может не принимать! В нашем примере функция в качестве параметра принимает текст, с которым нужно работать, и после выполнения работы возвращает результат, которым можно либо воспользоваться сразу, либо для начала сохранить в переменную.
Список стандартных функций PHP и примеры их использования Вы можете посмотреть в документации к PHP. Надеюсь, Вы поняли как ними пользоваться и дальше документация Вам поможет.
Стандартные функции - это, конечно, хорошо, но они не могут обеспечить всех необходимых программисту возможностей, поэтому, если программиста что-то не устраивает, он может сделать это сам и, здесь, собственно, суть статьи - Пользовательские Функции! Это те, которые создает сам программист для выполнения необходимых ему задач, а не те, которые предоставляет язык программирования.

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

function имя(параметры) {
тело
}
Пример:
<?php

function hello($username) {
echo 'Hello, ' . $username;
}
Функция создана и теперь мы можем ней воспользоваться:

<?php

hello('User');
На странице будет
Hello, User
Наша функция принимает параметр (имя того, с кем нужно поздороваться) и не возвращает результат! Параметров может быть сколько угодно - в таком случае они перечисляются через запятую. Так же параметров может вообще не быть, и тогда между круглыми скобками указывать ничего не нужно. Возвращать данные можно используя ключевое слово return, и вернуть можно только одно значение. Еще несколько примеров:

<?php

// Не принимает параметров и не возвращает результат
function hello() {
echo 'Hello, World!';
}

// Принимает один параметр и возвращает результат
function len($x) {
// $x - диаметр окружности; возвращается её длина
return ($x * 3.14);
}

// Принимает два параметра и возвращает результат
function s($x, $y) {
// $x и $y - стороны прямоугольника; возвращает его площадь
return ($x * $y);
}
Этого, в принципе, достаточно для начала, но в этой теме есть еще множество нюансов, которые я сейчас попытаюсь объяснить.

* В ЯП есть такое понятие, как Область Видимости. Суть в том, что разные фрагменты программного кода хранят свои данные в разных участках памяти, и переменные с одинаковыми именами во-первых могут быть совершенно разными; во-вторых могут не конфликтовать между собой. Вот пример для большего понимания:

<?php

$x = 5;
$x = 6;
$x = 7;
Здесь мы работаем с одной и той же переменной, и "на выходе" её значение будет 7. Области видимости делятся на локальную и глобальную, и распределены так:
* файл (глобальная)
* функцию (локальная)
* класс (локальная)
.. и на еще какие-то.

Так вот, переменные с одинаковым именем но в разных областях видимости будут разными, и будут жить своей жизнью! Вот пример:

<?php

$x = 5; // это глобальная область видимости 'файл'

function test() {
// это тело функции и локальная область видимости 'функция'
$x = 10;
echo $x;
}

echo $x . '<br>';

test();
На странице в первой строке будет 5, во второй 10. Как видите, переменные хоть и с одним именем, но они разные, потому что находятся в разных областях видимости!

* Передача параметров. Есть два способа: по значению и по ссылке. Во всех предыдущих примерах мы указывали параметры по значению, а разница вот в чем. В первом случае значение переменной копируется (!) из глобальной области видимости (файл) в локальную (функция), и что бы мы ни делали с этими данными, значение переменной останется прежним (если только не перезаписать его результатом работы функции), потому что мы работаем с копией её данных! Так делается зачастую, особенно в PHP, но иногда для работы бывает необходимо, чтобы функция работала напрямую с данными переменной. В таком случае при создании функции необходимо с помощью символа "&" (амперсанд) перед именем параметра указать, что мы передаем значение переменной по ссылке. То есть будет передано не значение переменной, а адрес памяти, по которому находятся её данные. Пример:

<?php

function rev(&$x) {
$x = strrev($x);
}

$text = 'Hello';

rev($text);

echo $text;
Код не проверял, но надеюсь что он работает. По идее на страницу должен вывестись перевернутый текст, и это при том, что результат работы функции никуда не сохранялся - функция изменила значение переменной из глобальной области видимости "файл", и затем это значение оттуда же и вывелось на страницу. Вопреки нашему с Вами соглашению, я намеренно сохранил текст в переменную, потому что только так можно продемонстрировать эту тему.

* Обратите внимание на то, что имена переменных-параметров - это имена, которые будут использоваться внутри функции! Пример:

<?php

$width = 5;
$height = 6;

function f($x, $y) {
return ($x * $y);
}

f($width, $height);
В основном коде мы используем переменные $width и $height, и передаем их в функцию, но в внутри функции мы должны обращаться к переданным данным по именам $x и $y, потому что именно они указаны в качестве параметров!

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

<?php

function test() {
$count = 0;
$count++;
echo $count;
}
Если вызвать функцию несколько раз, она всегда будет выводить на страницу "1", потому что значение переменной $count будет устанавливаться в "0" при каждом вызове. Если с помощью ключевого слова static сделать переменную статической, начальное значение будет установлено только при первом вызове функции, и при каждом последующем вызове оператор инкремента будет увеличивать её значение. Пример:

<?php

function test() {
static $count = 0;
$count++;
echo $count;
}

test(); // 1
test(); // 2
test(); // 3
Ну вот, на этом всё :-)

Комментарии (10)

Ждем что то посложнее.
И желательно из реальными задачами.
Спасибо! :-)
На форуме есть Барахолка, где можно обсуждать вопросы, заслуживающие отдельных статей - пишите туда - обсудим ;-)
Ок, понял
Я сейчас мало на спейс захожу, но думаю пару раз в неделю смогу заходить почитать ваши краткие уроки :чит3
Спасибо за внимание! :-)
А на рускам можно писать тело?
Полезный урок, спасибо :super
На удивление, PHP позволяет писать программный код кириллицей, точнее часть программного кода - можно давать кириллические названия переменным и пользовательским функциям, но практиковать это в реальных проектах очень не рекомендуется: не все WEB-серверы и не все ОС могут правильно её обрабатывать.
P.S. Небольшой пример:

<?php
$тестоваяПеременная = 'Hello, World!';
echo $тестоваяПеременная;
Капец ты вовремя ответил))
:D Лучше позже, чем никогда :D
Показать комментарий
Скрыть комментарий
Для добавления комментариев необходимо авторизоваться
Уроки PHP
Разрушители
Новая эпическая онлайн-игра от Овермобайл. Битвы...
Тема: Светлая | Тёмная
Версия: Mobile | Lite | Touch | Доступно в Google Play