Функции function в php

Функции function в php

Функции function в php

Функции это участок кода function, где вы обрабатываете передаваемые данные и после сможете их запросить в любом месте страницы, независимо где находится функция, а где необходимо показать результат.

При открытии страницы, php вначале сканирует ее на наличие функции, а после уже начинает читать все остальное, за исключением если function не вложена в фигурные скобки, в оператор или в другую функцию. Конкатенация функции с текстом , через запятую. 

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

print_r ("в скобках передаем параметры для обработки"); // да это и есть встроенная функция

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

Результат работы встроенных функций, записываем в переменную, либо сразу выводим.

$result = rand(); // записали в переменную
echo rand(); // вывели сразу 

Пример функции, которая не принимает аргументов. Функция rand() генерирует и возвращает случайное число. Если мы хотим передать диапазон чисел которые должны быть с генерированы то запишем в скобах условие или как в языке С через знак %.

echo rand(0 , 10); // генерировать число от  0 до 10
echo rand() % 15; // генерировать до числа 15

Либо выведем тип значения переменной, функцией gettype.

$result = 'функция gettype выводит тип переменной';
 
print_r(gettype($result));

Особенность некоторых встроенных функций, принимать переменное число аргументов.  
К примеру функция max(), находит максимальное значение из переданных аргументов. Выведем функции для примера.

echo max(-10, 0, 3, 12); // 12 

Работа функции 

max ( сочетать $значения [, mixed $… ] ): mixed

Такая запись говорит о том, что эта функция принимает на вход любое число аргументов (и даже может быть вызвана без них). Необязательность передаваемых аргументов описывается скобками [ ], точно так же описываются и опциональные параметры, у которых есть значения по умолчанию. Возможность передачи любого числа параметров зашита в этой части [, ...]

Помимо выражений, в функциях можно использовать переменные с любыми значениями.
Пару простеньких примеров.
Допустим мы хотим узнать, сколько денег бы у нас оставалось, если бы не было налога НДС.   
Создадим переменную с зарплатой и в функции высчитаем сумму НДС. 
Математической функцией round, которая округляет число, работаем с переменной и выражениями в функции.

$zar= 21500; // зарплата
$nds = round($zar * 20 /100);  // умножили переменную с суммой зарплаты на 20 и разделили на 100, получили 20% от зарплаты.
 
echo $nds; // 4300 Эту сумму от зарплаты  мы оставляем в магазине в виде налога.

Так же можем заменить 20 на переменную и в ней передавать сумму налога.
 Ну и остаток от зарплаты, минус НДС. 

$nds = round($zar - ($zar * 20 /100));  // отняли от переменной с зарплатой - НДС. 
echo $nds; // 17200 зарплата с вычетом налога НДС   

Вызов функции внутри функции

Используем две встроенные функции,  в round  передаем два параметра,  abs находит модуль числа sum, то есть из отрицательного делает положительное и числом 3, количество десятичных знаков, до которых производится округление. 

$sum = -21.12345; // отрицательное float
$res = round(abs($sum), 3); // abs делает положительным. округляем float до 3 знаков после точки 
 
echo $res; 

Распишем функцию пошагово.

$sum = -123.12345; // записали число в переменную
$res = abs($sum); // нашли модуль функцией abs
$res = round($sum , 3); // функцию округлить передали два параметра, число в переменой, и число которое округляет до 3 знаков после точки.  
 
echo $res;  // вывели результат

Функция работы с текстом 

Работа с текстом при помощи функций, пару примеров.
Создадим функцию ucfirst(), которая первый символ переводит в верхний регистр и при помощи конкатенации напишем приветствие.

$text = ucfirst('hi '.' friends '); // Hi friends 

Запишем переменную с текстом и добавим ее в функцию при помощи конкатенации, выше научились вызывать функцию внутри функции. Выведем текст из переменной в верхнем регистре, при помощи функции strtoupper(), которую запишем внутри функции.

$hw = 'hello world!';  
 
$text = ucfirst('hi '.' friends - ' . (strtoupper($hw))); // Hi friends - HELLO WORLD! 

Создаем функцию

Давайте представим для наглядности, что весь код который мы писали раннее, запишем в функции, передадим ей данные и просто получим результат. Естественно таких функций,  можно создавать вагон и маленькую тележку. Главное их не перепутать. Имена функциям задаются так же как и переменным, с буквы или подчеркивания _FuncTion  и регистр имеет значение. Одно исключение, названия встроенных функций php нельзя использовать в своих названиях функций и у каждой функции должно быть уникальное имя, и файл с функцией должен быть подключены перед ее вызовом.

function функция

Написанная функция создается так, вначале пишем function, название функции, ($параметры которые всегда являются переменными).

function название_Функции($параметры  , $_череЗапятую ){ // тут параметры
$параметры = 'Параметры пишем как переменную со знаком долар $.'; // 1 убрать
$_череЗапятую = 'Внутри фигурных скобок работаем с параметрами'; // 2 убрать
return "выводим результат командой return.  $параметры $_череЗапятую "; 
}
$аргуметры = 'переменные';
$тут_Аргументы = 'передаем в аргументы';
 
echo название_Функции($аргуметры , $тут_Аргументы );// передаем в параметры

После как отработает код уберите внутри функции переменные 1 и 2,  посмотрите на результат.

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

Запишем функцию без параметров и аргументов, в которой сделаем вычисления и выведем их.
Пример 1.

function lol(){ // создали функцию с именем lol
$sum = 3+4+5; // в переменной сделали вычисления
return "улыбнись $sum раз"; // и вывели результат в внутри функции
}  
 
echo lol(); // вывели функцию по имени. Смешно для этого писать функцию.

Запишем функцию, имя и параметры в которые будем передавать аргументы. В фигурных скобках запишем функционал, вернем результат и вызовем функцию.

function имя_функции( $параметр1, $параметр2) {

$переменная = $параметр1 + $параметр2; // работа функции.

return $переменная; // возвращаем результат.

}
echo имя_функции(аргумент3, аргумент4);
//выводим результат работы, передавая аргументы в функцию. Как вы видите параметры и аргументы разные.

Мы с вами высчитывали налог, записывали выражения внутри функции и выводили результат. К примеру если нам нужно высчитать налог не 20% НДС, а налоги с зарплаты в 46%, придется переписывать либо выражения, либо переменную. Намного проще если мы создадим такую функцию и будем к ней обращаться при необходимости. Создадим функцию налог. 

function nalog($zar , $proc){ // в функции налог создали параметры зарплаты и процента
$nalog = $zar * $proc / 100; // в переменной сделали расчеты
return $nalog; // вывели результат 
}
 
echo nalog(21500 , 46); // в функцию налог передаем аргументы в параметры сумму зарплаты и процент налога. 

Если мы хотим вычесть налог то, в  результате от зарплаты отнимем налог и получим остаток зарплаты. Так же мы можем передавать данные в аргументы через переменные.

return $zar - $nalog; 

Параметры и аргументы функции

Начнем с самой простой функции, для понимания как что работает. Передадим функции подсчет фруктов. Главное что нужно уяснить, что объявленные переменные вне функции и переменные внутри функции не имеют друг к другу никакого отношения. Аргументы в параметры передается по очереди, а не по имени. Пример.

$gr = 5; // 5 груш 
$ap = 5; // и 5 яблок
function fruct($grushi , $aplle){ //Записываем параметры в другие переменные
return = $grushi + $aplle; // делаем расчет и выводим результат
}
 
  echo fruct($gr , $ap); // а здесь мы через параметры передаем в работу функции данные из переменных и тут же выводим результат работы функции.

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

Глобальная переменная в функции.

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

$gr = 5; // 5 груш
$ap = "5 яблок"; // и 5 яблок
function fruct($apple) { // Передаем в аргумент один параметр, только от переменной яблок
global $gr;    // создали глобальную переменную груш,  которая одинаковая, как внутри так и снаружи функции.
return $gr + $apple;  // возвращаем сразу результат
} 
echo fruct($ap); //  передали один аргумент, а получили результат суммы фруктов. 

Такая запись выведет не критическую ошибку из за изменений в php-8. Теперь записываем в переменные только один тип данных, либо текст, либо цифры 

Улучшенное сравнение строк и чисел
Теперь при сравнении с числовой строкой PHP 8 использует сравнение чисел. В противном случае число преобразуется в строку и используется сравнение строк. 

Ошибки согласованности типов для встроенных функций
В PHP 8 большинство внутренних функций теперь выбрасывают исключение Error, если при проверке параметра возникает ошибка.
Так как мы работаем с переменной $ap как с integer, а она у нас записана в кавычках как string. 

Условия внутри функций 

Создадим условие, каких фруктов меньше и выведем результат.

$gr = 6; // 6 груш
$ap = 5; // и 5 яблок
function fruct($ap, $gr) { // Передаем в параметры груши и яблоки
if ($gr <= $ap) { // сверяем каких фруктов меньше либо равно.
return "$gr груш меньше";  // возвращаем сразу результат если груш.
} 
return "$ap яблок меньше"; // и если яблок меньше.
} 
echo fruct($ap , $gr); // передали параметры, а получили результат каких фруктов меньше. 

У нас нет в условии варианта равно, поэтому при равном количестве фруктов, посмотрите что произойдет.
Передадим еще один аргумент. Выведем его в краткой записи php с тегами html. Не забудьте закрыть код php перед этой записью.

<h2> <?= fruct($gr=12 , $ap=11) ?> </h2> 

Получим 11 груш меньше. Заметили ошибку? Мы передавали переменную яблок, а нам выдало груш. Здесь нужно быть внимательными при передаче аргументов в параметры и параметров в условие. Параметры в функции принимаются не по названию аргумента, а его очередность.

функции php

Передаем аргументы (4, 7, 3) Принимает параметр (1, 2, 3), а уже в функции, параметры передают данные в условие, по названию переменной (1, 2, 3). Так у нас функция принимает из параметра $gr груши и в условие первым идет, если груш меньше, а параметр $gr принимает из второго аргумента $ap=11. Поэтому произошла смена, мы думали что передавали груши, а получили яблоки. Для избежания подобных недоразумений, можно использовать именованные аргументы в функциях 

Создавать глобальные переменные внутри функций не рекомендуется, как и выводить результат внутри функции echo, лучше возвращать результат return

Именованные аргументы в функции php 8

В PHP 8.0.0 появились именованные аргументы. С их помощью аргументы функции можно передавать по имени параметра, а не по его порядку. Таким образом связывается аргумент с параметром по имени, независимым от порядка и указанного значения по умолчанию.

Именованные аргументы передаются путём добавления имени параметра двоеточие перед его значением. В качестве имён параметров можно использовать зарезервированные ключевые слова. Имя параметра должно быть идентификатором, т.е. он не может быть создан динамически.

Именованные аргументы можно комбинировать с позиционными. В этом случае именованные аргументы должны следовать после позиционных. Также возможно передать только часть необязательных аргументов функции, независимо от их порядка.

Давайте исправим ошибку в предыдущем примере, переписав аргументы в именованные. Зададим аргументам имена параметров в функции.
gr: $gr=12, ap: $ap=11 

<h2> <?= fruct(gr: $gr=12 , ap: $ap=11) ?> </h2> 

И получим правильный ответ (11 яблок меньше.)
При использовании именованного аргумента, необходимо точно указывать имена аргументов и параметров и если вы передадите аргументы с одинаковыми именами, вы получите ошибку.  

Переменные внутри функции, ссылка на переменную в параметре. 

Для того чтобы работать с переменными вне функции, меняя их данные внутри функции, нужно создать в параметре ссылку на переменную. Ссылка на переменную в параметре создается знаком &. Таким образом работая в функции с параметром,  на который ссылкой передали данные из переменной, через аргумент. Выводя переменную, мы получаем информацию из функции. 
Меняем глобальную переменную на ссылку. Пример. 

$gr = 5; 
 
$ap = 7;
 
function fruct($apple , &$g) { // добавили ссылку к параметру $g
$g += 10;  // к переменной $g по ссылке из вне передали 5 и прибавили 10 
}
fruct($ap , $gr); // передаем параметры в функцию 
 
echo $gr // вывели переменную и получаем 15, так как ее обработали в функции по ссылке. Если ссылку убрать, получим 5

Параметр функции по умолчанию

Если при вызове функции параметров в ней больше чем вы передаете аргументов, то выведет ошибку. Для того чтобы избежать ошибки запишем в параметр данные по умолчанию. Для будущего использования, в параметр по умолчанию можно записать NULL либо 0, а при передаче аргумента, этот параметр будет перезаписан. Давайте для примера зарезервируем параметр для будущих лимонов. Добавим лимоны. Параметры по умолчанию записываются в конце переменных, с передаваемыми параметрами. Параметры по умолчанию записываются так же как аргументы, знаком равно и если текст то в кавычках.
Пример.$parametr = 'я текст в параметре по умолчанию'

$gr = 6; // 6 груш  <br><br>$ap = 5; // и 5 яблок  
 
$lim = 11; 
function fruct($grushi , $aple , $lim=0){ // добавили лимон, если мы зададим ему число, то оно будет в подсчете, хотя никакого аргумента мы не передавали. Попробуйте изменить ноль на число.
$sum = $grushi + $aple + $lim; // мы сразу добавили лимон в подсчет фруктов.
return $sum; // возвращаем результат.
}
echo fruct($gr , $ap ) .'<p>' ; // а здесь мы не указали третий аргумент, но ошибки нет, так как в параметре лим есть значение по умолчанию 0.
echo fruct($ap , $lim) .'<p>' ; // передаем в аргументы данные из переменных яблоки и лимоны и получаем 16. Так как мы уже добавили в параметр груши, то и ошибки нет.

Оператор многоточие в функции php-8 или Spread-оператор 

В новых версиях и в php-8 чтобы не резервировать параметры в функциях, пишем параметр с многоточием.
Все передаваемые аргументы может принимать один параметр ...$parametr. Таким образом функция принимает переменное количество аргументов, то есть сколько вам необходимо передать в аргументах. Аргументы в этом случае можно передать в виде переменных либо в виде массива. 
Перепишем нашу функцию с новым параметром. Добавим в переменные фруктов. Параметр лимон заменим на параметр с троеточием ...fruct. В него передаем все оставшиеся аргументы. При помощи встроенной функции array_sum, пересчитаем количество фруктов из остальных переменных, передающих аргументы в оператор многоточие.
 Пример

$gr = 5; $ap = 7; $lim = 11; $man = 15; $vin = 18; $sliv = 21;
function fruct($grushi , $aple , ...$fruct){ // записали параметр с троеточием ...fruct. В него передаем все оставщиеся аргументы. 
$sum = $grushi + $aple + array_sum($fruct); // функцией array_sum сичтаем аргументы переданные в параметр frukt.
return $sum; // возвращаем результат.
} 
echo fruct($ap , $gr, $lim, $man, $vin, $sliv) ; // передаем в функцию данные из переменных и тут же выводим их

Естественно, если нам не нужно отдельно обрабатывать в функции, переданные в параметры данные из аргументов, то в таком случае можно убрать остальные параметры. Пример.

function fruct( ...$fruct){ // в параметр с многоточием передали все аргументы  
return array_sum($fruct); } // выели результат сложения подсчитанный функцией array_sum, переданные аргументами данные в параметр с многоточием 

Таким же образом оператора spread, можно передать в функцию массив с фруктами, но записывать его нужно в конце аргументов. И если мы записываем ассоциативные ключи в массиве, то их тоже нужно записать в конце. Пример 

$fruct = [11, 22, 33, 'gr' => 5, 'ap' => 7, 'lim' => 11, 'man' => 15, 'vin' => 18];  // массив 
echo fruct( $sliv, 33 ,' 11', ...$cif  ); // и даже если число будет записано строкой как 11

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

Тайп хинтинг (указание типов параметра)

Тайп хинтов (type hints). Мы можем указать, какой тип данных должен быть у параметра.
С версии php-7 можно указать тип как для одного из параметров так и для функции. Для функции записываем за параметрами через двоеточие: int

Пример.

В прошлом уроке мы при количестве фруктов 9, должны были посмотреть каких фруктов меньше. Давайте напишем функцию подсчета, сколько и каких фруктов меньше и сразу выводить.

Пример: Меньше всего фруктов.

$a = '4 яблок';  $b = '16 груш';   $c = '9 слив'; // допустим мы сразу ввели с количеством название фруктов.
fruct ($a , $b , $c);  // создали аргументы в которых передадим количество и название.
function fruct($a , $b , $c) : int   {   // принимаем данные в параметры и указали для приема тип число.
if ($a <= $b && $a <= $c) {  // создаем условие когда а меньше или равно б и а меньше или равно c 
echo " меньше всего $a  <p>";} // показываем меньше всего а
elseif ($b < $a && $b < $c){  // еще если б меньше а, и б меньше с
echo "меньше всего  $b <p>";  // выводим меньше всего б 
}
else  { 
echo "меньше всего $c  <p>";  // иначе меньше всего с.
 
}}

И получаем (меньше всего 16 груш) и ошибку, так при сравнении php посчитал только 1, а не 16. Если мы пропишем для каждого параметра тип 

function fruct( int $a ,  int $b , int $c)  { // то в php-7 получим наименьшее число, но без названия фрукта так переменные преобразовалось в число. 

 А в php-8 получим фатальную ошибку. Fatal error: Uncaught TypeError: fruct(): Argument #1 ($a) must be of type int, string given, called in  

Рекурсивная функция 

Функция которая вызывается сама в себе. Можно сравнить с циклом. Подробнее использование рекурсии будем разбирать в следующих уроках. Сейчас для примера посмотрим что это такое. Пример. 

$ap = 8; 
 
function rec($ap) {   // создаем функцию для рекурсии с аргументом яблок 
if ($ap <= 9){     // условие проверяем если яблок меньше 9 
echo ($ap++) . ' докупить яблок <p>';  // если меньше 9 то постфиксный инкремент, докупить яблок.
rec($ap);  // вызываем функцию внутри себя. если $ap не 9 то возвращаемся на +1 докупить яблок, 
} else return;  //   если не 9, выводим результата. При разных названиях переменных и параметров, будет бесконечное увеличение.
} 
rec($ap); // передаем функции аргумент с данными яблок.  

Поменяйте количество яблок в переменной $ap на 8 и 7, и посмотрите результат.

Статическая переменная в функции. 

Статическая переменная объявляются при помощи ключевого слова static. От обычных переменных она отличается сохранением данных которые не удаляются после выполнения функции. Чем то похоже на рекурсивную функцию, но которая увеличивается при вызове вне функции. Пример.

$ap = 5; // объявляем переменную.
 
function rec($ap) { // создаем функцию с аргументом яблок
static $ap; // создаем статическую переменную у которой данные только внутри функции.
$ap++; // увеличиваем ее на +1.
return $ap; // возвращаем результат.
}
$rezult = rec($ap); // передадим в переменную данные из функции для вар дамп, при этом при передаче данных мы вызывали функцию в которой статичная переменная увеличивается на +1 
var_dump($rezult); // проверяем данные из функции занесенные в переменную и получаем 1. Так как при записи в переменную мы уже один раз вызвали функцию. 
echo rec($ap) . ' яблока <p>'; // выводим функцию с статической переменной которая в этот раз уже равна 2, так как в статической перменной уже записан результат 1 с прошлого вызова.
rec($ap); // вызываем функцию и получаем +1 к прошлому результату, то есть 3
 
echo rec($ap) . ' яблока'; // выводим функцию и получаем 4 по уже известной причине. 

Результат работы функции статической переменной 
 int(1) 2 яблока 4 яблока. 

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

Домашнее задание 

Запишите условии в Примере: Меньше всего фруктов. Чтобы с меньше всего, после цифры выводилось и название фруктов, и не было ошибки в php-7 и в  php-8. 

Перепишите условие так, чтобы при равно любых из аргументов, выводились данные, каких меньше фруктов и в каком количестве.

Продолжить просмотр за:
100 Лит
20:55
653
Lit
RSS
Нет комментариев. Ваш будет первым!

Похожий контент

В PHP подключаем файлы операторами include и require.  В этом уроке мы научимс...
Массивы в PHP это набор упорядоченных данных. Создадим ассоциацию для массива, массив - ...