Пользовательские функции
Выражение return
Встроенных в PHP функций может быть не достаточно. PHP дает возможность создавать собстенные функции , объявлять их и затем использовать. То есть использовать пользовательские функции . Эти функции нужны для того,чтобы сделать удобным использования нашего кода. Например, при дублировании части кода, который мы можем использовать хотя бы два раза, а то и больше, то такой код очень удобно обернуть в функцию, которая затем вызывается точно так же как и функции PHP.
Пользовательские функции
Создадим в папке с уроком новый файл funcs.php и вынесем в него нашу функцию.
Подключаем в файле index.php с помощью require_once файл funcs.php
Если мы хотим использовать фукцию в другом файле, нам достачно подключить файл funcs.php и вызывать функцию sum($a, $b) . Причем в файле funcs.php, еще его называют библиотекой функций , может быть объявленно сколь угодно много различных функций.
Если функция вызвана без параметров, то это вызовет ошибку. Что-бы обезопасить наш код от оплошности пользователя — надо для функции установить параметры по умолчанию. Например: $a = 1, $b = 2 , при этом ошибка пропадет:
Если функция вызвана с одним параметром, то второй параметр будет — по умолчанию.
Если переменная объявлена вне функции, на результаты вызовов функции sum это не повлияет.
Подключение файла funcs.php и вызов функции в индексном файле:
// Подключаем файл funcs.php
require_once ‘funcs.php’ ;
// вызов функции, в качесте параметров передаем два числа
sum ( 5 , 7 );
// повторный вызов функции
sum ( 10 , 5 );
sum ( 5 , 10 );
// переменная вне функции — на результаты вызовов функции sum не повлияет
$a = 200 ;
// объявление переменных
$x = 100 ;
$y = 10 ;
// вызов функции, где в качестве параметров — объявленные переменные
sum ( $x , $y );
// вызов функции без параметров — вызовет ошибку (если параметры не установленны по умолчанию)
sum ();
// вызов функции с одним параметром — второй параметр будет — по умолчанию
sum ( 100 );
// вызов функции, где в качестве параметров — объявленные переменные
110
// при вызове функции без параметров (параметры по умолчанию: $a = 1, $b = 2 )
3
// при вызове функции с одним параметром (100 + 2 = 102 — второй параметр: $b = 2)
102
// переменная вне функции, выведена с помощью echo
200
— где function — ключевое слово,
(Название функции может начинаться либо с буквы , либо с символа подчеркивания ),
— $a и $b — параметры функции (локальные переменные, которые используются внутри функции),
— $x и $y — переменные , а $a и $b — параметры
Имя функции не должно пересекаться с именем уже имеющихся функций. То есть, два раза объявить одну и ту же функцию нельзя.
Вызывать функцию можно повторно сколько угодно раз.
Если же переменная объявлена внутри функции , то результаты вычислений поменяются, а переменная $a , объявленная вне функции, останется без изменения:
function sum ( $a = 1 , $b = 2 ) <
$a = 300 ; // переменная объявляется внутри функции
echo $a + $b ;
echo ‘
‘ ;
>
// подключаем файл funcs.php
// переменная $a = 300 объявленна внутри функции
require_once ‘funcs.php’ ;
// вызов функции, в качесте параметров передаем два числа (300+7=307)
sum ( 5 , 7 );
// повторный вызов функции (300+5=305)
sum ( 10 , 5 );
// переменная вне функции — на результаты вызовов функции sum — не повлияет
$a = 200 ;
// объявление переменных
$x = 100 ; $y = 10 ;
// вызов функции, где в качестве параметров — объявленны переменные (300+10=310)
sum ( $x , $y );
// вызов функции без параметров — вызовет ошибку
// (если параметры не установленны по умолчанию, по умолчанию у нас 300+2=302)
sum ();
// вызов функции с одним параметром — второй параметр будет — по умолчанию (300+2=302)
sum ( 100 );
выведет:
307
305
310
310
302
302
200 // переменная вне функции, выведена с помощью echo
Пример перадачи значения по ссылке
В файле funcs.php объявим функцию sum_1 , где переменная $a — переменная, которая передается по ссылке ( & ):
Вызываем функцию sum_1 в файле index.php:
// поключаем файл funcs.php
require_once ‘funcs.php’ ;
echo $a ; // переменная $a до вызова функции
echo ‘
‘ ;
sum_1 ( & $a , $b ); // вызов функции sum_1( & $a, $b)
echo $a ; // переменная $a после вызова функции, выведена с помощью echo
?>
выведет:
5 // переменная $a до вызова функции
15 // результат работы функции sum_1(& $a, $b)
100 // переменная $a после вызова функции, выведена с помощью echo
— если мы передадим переменную $a по ссылке & , то увидим результат — переменная $a изменилась
и приняла значение $a = 100 , то есть функция теперь ее меняет. Она теперь равна не 5 , а 100 — тому значению, которое было поставленно в функции, поскольку переменную $a мы передаем по ссылке.
return в функциях
Слово return переводится как «вернуть».
В файле funcs.php объявим функцию sum_2 :
// функция sum_2
function sum_2 ( $a , $b ) < // объявление функции sum_2
$c = $a + $b ;
return $c ;
// return $a + $b; — сразу возвращаем результат
>
Вызываем функцию sum_2 , и передадим ей два параметра: 1 и 2
// поключаем файл funcs.php
require_once ‘funcs.php’;
sum_2 ( 1 , 2 ); // результат ее работы на экран не выводится
echo sum_2 ( 1 , 2 ); // выведет 3
echo ‘
‘ ;
echo 5 + sum_2 ( 1 , 2 ); // выведет 8
echo ‘
‘ ;
$res = sum_2 ( 1 , 2 );
echo $res ; // выведет 3
?>
Выведет с помощью echo:
3
8
3
Слово return переводится как «вернуть», «возвратить». И в данном случае наша функция не выводит на экран результа, она его возвращает в программу для дальнейшего использования и его мы можем вывести с помощью оператора echo .
Например, мы можем прибавить 5 к результату, который вернула функция, или сохранить его в переменную.
Признаком зачастую хорошего тона является сделать функцию, которая будет не выводить сразу что-то на экран, а именно возвращать результат с помощью оператора return , поскольку в дальнейшем пользователь может сделать с этим результатом что угодно. Он может его вывести, сохранить в переменную, константу, сохранить в базу данных. Не обязательно сохранять результат в переменную, мы можем сразу его вернуть:
Так же функция может возвращать что угодно, например: булево — true , false ; и т. д.
Написать собственную функцию, аналог функции array_keys , которая возвращает ключи массива. То есть наша функция возвращает массив, значением которого будут ключи, того массива, который мы передаем в качестве параметра.
Работа функции array_keys :
// поключаем файл funcs.php
require_once ‘funcs.php’;
$nums = [ 1 , 2 , 3 ];
$keys = array_keys ( $nums );
print_r ( $keys );
// выведет: Array ( [0] => 0 [1] => 1 [2] => 2 )
?>
В файле funcs.php объявим функцию my_array-keys($arr) , в качестве параметра она принимает массив $arr :
// функция my_array_keys
function my_array_keys ( $arr ) $data = []; // объявляем пустой массив
foreach ( $arr as $k => $v ) $data [] = $k ; // заполняем массив $data ключами $k
>
return $data ; // возвращаем массив $data
>
вызываем поочередно нашу функцию my_array_keys , с параметрами $nums , $names , $names2 и test :
// поключаем файл funcs.php
require_once ‘funcs.php’ ;
$nums = [ 1 , 2 , 3 ];
$names = [ ‘ivanon’ , ‘Petrov’ ];
$names2 = [ ‘Ivan’ => ‘Ivanov’ , ‘Petr’ => ‘Petrov’ ];
$test =[];
$keys = my_array_keys ( $nums );
print_r ( $keys );
// Результат аналогичен работе функции array_keys.
// выведет: Array ( [0] => 0 [1] => 1 [2] => 2 )
echo ‘
‘ ;
$keys2 = my_array_keys ( $names );
print_r ( $keys2 );
// выведет: Array ( [0] => 0 [1] => 1 )
echo ‘
‘ ;
$keys3 = my_array_keys ( $names2 );
print_r ( $keys3 );
// выведет: Array ( [0] => Ivan [1] => Petr
echo ‘
‘ ;
$keys4 = my_array_keys ( $test );
print_r ( $keys4 );
// выведет: Array ( )
echo ‘
‘ ;
?>
выведет:
Array ( [0] => 0 [1] => 1 [2] => 2 ) // $keys
Array ( [0] => 0 [1] => 1 ) // $keys2
Array ( [0] => Ivan [1] => Petr ) // $keys3
Array ( ) // $test
return
return возвращает управление программой в вызывавший модуль. Выполнение возвращается в выражение, следующее после вызова текущего модуля.
Если вызвано из функции, выражение return немедленно прекращает выполнение текущей функции и возвращает свой аргумент как значение данной функции. return также завершает выполнение выражения eval() или всего файла скрипта.
Если вызывается из глобальной области видимости, выполнение текущего файла скрипта прекращается. Если текущий файл скрипта был подключен с помощью функций include или require , тогда управление возвращается к файлу, который вызывал текущий. Более того, если текущий файл скрипта был подключен с помощью include , тогда значение переданное return будет возвращено в качестве значения вызова include . Если return вызывается из главного файла скрипта, тогда выполнение скрипта прекращается. Если текущий файл скрипта был вызван конфигурационными опциями auto_prepend_file или auto_append_file из файла настроек php.ini , тогда выполнение этого скрипта прекращается.
Для более детальной информации смотрите раздел Возвращаемые значения.
Замечание: Заметьте, что так как return является языковой конструкцией, а не функцией, круглые скобки, окружающие аргументы, не являются необходимостью. Общепринято не использовать их в данном случае и, в принципе, так и надо делать, т.к. PHP будет меньше работы по синтаксическому разбору файла в данном случае.
Замечание: Если параметры не указаны, тогда круглые скобки должны быть опущены, и вернется значение NULL . Вызов return со скобками, но без аргументов вызовет синтаксическую ошибку.
Замечание: Вы не должны использовать скобки при возврате переменной, если возвращаете по ссылке, так как это не сработает. Вы можете вернуть только переменную по ссылке, а не результат выражения. Если вы используете return ($a);, тогда вы вернете не переменную, а результат выражения ($a) (который, естественно, будет являться значением переменной $a ).
Возврат значений
Значения возвращаются при помощи необязательного оператора возврата. Возвращаемые значения могут быть любого типа, в том числе это могут быть массивы и объекты. Возврат приводит к завершению выполнения функции и передаче управления обратно к той строке кода, в которой данная функция была вызвана. Для получения более детальной информации ознакомьтесь с описанием return .
Замечание:
Если конструкция return не указана, то функция вернет значение NULL .
Использование выражения return
Пример #1 Использование конструкции return
Функция не может возвращать несколько значений, но аналогичного результата можно добиться, возвращая массив.
Пример #2 Возврат нескольких значений в виде массива
function small_numbers ()
return array ( 0 , 1 , 2 );
>
list ( $zero , $one , $two ) = small_numbers ();
?>?php
Для того, чтобы функция возвращала результат по ссылке, вам необходимо использовать оператор & и при описании функции, и при присвоении переменной возвращаемого значения:
Пример #3 Возврат результата по ссылке
Для получения более детальной информации о ссылках обратитесь к разделу документации Подробно о ссылках.
Объявление типов возвращаемых значений
В PHP 7 добавлена возможность объявлять тип возвращаемого значения. Аналогично объявлению типов аргументов можно задать тип значения, которое будет возвращаться функцией. Типы, которые можно объявить для возвращаемых значений те же, что и для аргументов фукнций.
Режим строгой типизации также работает для объявлении типа возвращаемого значения. В обычном режиме слабой типизации возвращаемое из функции значение приводится к корректному типу. При строгой типизации возвращаемое значение должно быть заданного типа, иначе будет выброшено исключение TypeError.
Замечание:
Если переопределяется родительский метод, возвращаемое значение дочернего метода должно быть того же типа, что и родительского. Если в родительском методе не задан тип возвращаемого значения, то и дочерний метод этот тип может не объявлять.
Примеры
Пример #4 Обычное объявление типа возвращаемого значения
// Будет возвращаться значение типа float.
var_dump ( sum ( 1 , 2 ));
?>
Результат выполнения данного примера:
Пример #5 То же в режиме строгой типизации
function sum ( $a , $b ): int return $a + $b ;
>
var_dump ( sum ( 1 , 2 ));
var_dump ( sum ( 1 , 2.5 ));
?>
Результат выполнения данного примера:
int(3) Fatal error: Uncaught TypeError: Return value of sum() must be of the type integer, float returned in - on line 5 in -:5 Stack trace: #0 -(9): sum(1, 2.5) #1 thrown in - on line 5
Пример #6 Возврат объектов
function getC (): C return new C ;
>
Результат выполнения данного примера: