Пользовательские функции в PHP (Часть 1)
В любом языке программирования существуют подпрограммы. В языке C они называются функциями, в ассемблере - подпрограммами, а в Pascal существуют даже два вида подпрограмм: процедуры и функции.
Подпрограмма - это специальным образом оформленный фрагмент программы, к которому можно обратиться из любого места внутри программы. Подпрограммы существенно упрощают жизнь программистам, улучшая читабельность исходного кода, а также сокращая его, поскольку отдельные фрагменты кода не нужно писать несколько раз
В PHP такими подпрограммами являются пользовательские функции.
Помимо встроенных функций PHP, часто возникает необходимость создания пользовательских функций, выполняющих определенные задачи.
Особенности пользовательских функций PHP
Перечислим особенности пользовательских функций в PHP:
- Доступны параметры по умолчанию. Есть возможность вызывать одну и ту же функцию с переменным числом параметров;
- Пользовательские функции могут возвращать любой тип;
- Область видимости переменных внутри функции является иерархической (древовидной);
- Есть возможность изменять переменные, переданные в качестве аргумента.
В PHP программисту дана достаточно высокая свобода при создании пользовательских функций. В отличии от языка C++ в пользовательских функциях доступны параметры по умолчанию.
Недостатком пользовательских функций PHP являются:
1. Невозможность объявления локальных функций. В PHP вы не можете объявить локальную функцию, как это можно сделать в других языках программирования. Попросту говоря, вы не можете создать функцию внутри другой функции таким образом, чтобы первая (вложенная) функция была видна только во второй функции. В PHP вложенная функция будет доступна всей программе (скрипту), а значит не будет локальной.
Рассмотрим пример:
<?php
function first_function() {
echo "<h4>Первая пользовательская функция</h4>";
function second_function() {
echo "<h5>Вторая пользовательская функция</h5>";
}
}
first_function();
second_function();
?>
В рассмотренном примере сценарий выведет:
Первая пользовательская функция
Вторая пользовательская функция
Значит, обе функции доступны программе. Это говорит о том, что вторая функция не является локальной.
2. Второй недостаток пользовательских функций PHP связан с областью видимости функций. Чтобы разобраться в этой категории, необходимо пояснить, какие переменные являются глобальными, а какие - локальными.
Глобальные переменные - это переменные, которые доступны всей программе, включая подпрограммы (функции).
Локальные переменные - переменные, определенные внутри подпрограммы (функции). Они доступны только внутри функции, в которой они определены.
Для PHP все объявленные и используемые в функции переменные по умолчанию локальны для функции. То есть, по умолчанию нет возможности изменить значение глобальной переменной в теле функции.
Если вы в теле пользовательской функции будете использовать переменную с именем, идентичным имени глобальной переменной (находящейся вне пользовательской функции), то никакого к отношения глобальной переменной эта локальный переменная иметь не будет. В данной ситуации в пользовательской функции будет создана локальная переменная с именем, идентичным имени глобальной переменной, но доступна данная локальная переменная будет только внутри этой пользовательской функции.
Поясним данный факт на конкретном примере:
<?php
$a = 100;
function funct() {
$a = 70;
echo "<h4>$a</h4>";
}
funct();
echo "<h2>$a</h2>";
?>
Сценарий выведет сперва 70, а затем 100:
70
100
Для избавления от приведенного недостатка, в PHP существует специальная инструкция global, позволяющая пользовательской функции работать с глобальными переменными. Подробнее об этом можете узнать здесь
Создание пользовательских функций
Пользовательская функция может быть объявлена в любой части программы (скрипта), до места ее первого использования. И не нужно никакого предварительного объявления, как в других языках программирования, в частности, в C. Преимущества применяемого в PHP подхода в следующем.
Дойдя до определения пользовательской функции, транслятор проверит корректность определения и выполнит трансляцию определения функции во внутреннее представление, но транслировать сам код он не будет. И это правильно - зачем транслировать код, который, возможно, вообще не будет использован. Синтаксис объявления функций следующий:
function Имя (аргумент1[=значение1],...,аргумент1[=значение1])
{
тело_функции
}
Объявление функции начинается служебным словом function, затем следует имя функции, после имени функции - список аргументов в скобках. Тело функции заключается в фигурные скобки и может содержать любое колличество операторов.
Требования, предъявляемые к именам функций:
- Имена функций могут содержать русские буквы, но давать функциям имена, состоящие из русских букв не рекоммендуется;
- Имена функций не должны содержать пробелов;
- Имя каждой пользовательской функции должно быть уникальным. При этом, необходимо помнить, что регистр при объявлении функций и обращении к ним не учитывается. То есть, например, функции funct() и FUNCT() имеют одинаковые имена;
- Функциям можно давать такие же имена, как и переменным, только без знака $ в начале имен.
Типы значений, возвращаемые пользовательскими функциями, могут быть любыми. Для передачи результата работы пользовательских функций в основную программу (скрипт) используется конструкция return. Если функция ничего не возвращает, конструкцию return не указывают. Конструкция return может возвращать все, что угодно, в том числе и массивы.
Приведем примеры использования пользовательских функций:
<?php
function funct() {
$number = 777;
return $number;
}
$a = funct();
echo $a;
?>
В рассмотренном примере функция funct возвращает с помощью конструкции return число 777. Возвращенное функцией значение присваивается глобальной переменной $a, а затем оператор echo выводит значение переменной $a в браузер. В результате мы увидим в браузере число 777.
Далее мы рассмотрим возможности PHP по передаче параметров пользовательских функций.