Функции в PHP: что это такое и как они работают
В обычную переменную можно записать число, строку или массив, а затем получить его обратно, обратившись к значению по имени переменной. Функции устроены похожим образом, только вместо строки или числа в ней хранится блок кода, который вызывается при использовании этой «переменной».
Функции помогают повторно использовать код, который нужен во многих местах программы. Если бы функций не существовало, пришлось бы копировать и вставлять фрагмент кода каждый раз, когда он понадобится. А так достаточно написать функцию один раз и вызывать её каждый раз, когда она нужна.
Функции нужны, чтобы не переписывать один и тот же код много раз.
Какие бывают функции
Функции бывают встроенные и пользовательские.
Встроенные функции за вас уже написали создатели языка, и вы можете просто брать их и использовать. В PHP существуют тысячи готовых функций на все случаи жизни — например, sort() для сортировки массивов, print() для вывода строк на экран или функции для работы с базами данных.
С ними программировать будет проще
Пользовательские функции программисты пишут сами — например, чтобы проверить данные пассажира по номеру авиабилета или определить, високосный ли сейчас год. Эти функции, как правило, используются только внутри одного проекта, но бывают исключения — и такие функции выносят в библиотеки.
Аргументы функции и область видимости
Функция — это как бы программа в программе. Это значит, что внутри неё не будут доступны переменные, которые определялись за её пределами. Чтобы передать внутрь функции информацию извне, нужно использовать аргументы функции.
Аргументы функции — это переменные, которые мы передаём в функцию для обработки. Аргументов может быть несколько.
Пример. Мы хотим показывать на сайте, является ли выбранный пользователем год високосным. Напишем функцию, в которую будем передавать год. В результате работы функции мы должны получить true , если год високосный, и false — если нет.
В такой функции нам нужен только один аргумент — номер выбранного года $year .
Функция «не видит» переменные, которые мы создали за её границами. Поэтому переменные в функцию нужно передавать явно — то есть, через аргументы.
Верно и обратное — переменные, определённые внутри функции, не будут доступны извне. Такие переменные называются локальными, потому что они локальны по отношению к функции.
В отличие от аргументов, которых может быть несколько, вернуть во внешний код функция может только одно значение — с помощью инструкции «return» (возврат). Возвращаемое значение называют результатом работы функции.
Как использовать функции
Функция состоит из нескольких частей:
- имени функции,
- аргументов, которые передаются в функцию,
- тела функции,
- оператора return, который отвечает за возврат результата в сценарий.
Аргументов в функции может и не быть — тогда она называется подпрограммой.
То есть объявление функции выглядит примерно так:
Давайте напишем настоящую функцию, которая по номеру года вычисляет, високосный ли он. Так будет проще понять, как устроены функции.
- Функция — это кусочек кода, которому дали имя.
- Функции нужны, чтобы не переписывать один и тот же код много раз.
- В функцию можно передать много переменных, но вернуть только что-то одно.
- Переменные внутри функции недоступны снаружи, внешние переменные нужно передавать через аргументы.
«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.
Php информация о функции
Документация к каждой функции в руководстве была написана с учётом быстрого обращения к этой документации. Зная как правильно читать и понимать текст, вам будет намного проще изучать PHP. Вместо того, чтобы полагаться на примеры или копирование/вставку, нужно просто понять как читать определения функции (прототипы). Давайте начнём:
Замечание: Предпосылки: Базовое понимание типов
Хотя PHP и является слабо типизированным языком, важно иметь базовое представление о типах, так как они играют большую роль в PHP.
Определения функций показывают нам какого типа значения они возвращают. Для первого примера возьмём определение функции strlen() :
strlen (PHP 4, PHP 5, PHP 7) strlen -- Возвращает длину строки Описание strlen ( string $string ) : int Возвращает длину переданной строки.
Часть | Описание |
---|---|
strlen | Имя функции. |
(PHP 4, PHP 5, PHP 7) | strlen() была во всех версиях PHP 4, 5 и PHP 7 |
( string $string ) | Первый (и в данном случае единственный) параметр/аргумент этой функции называется string , а его типом является строка ( string ). |
int | Тип возвращаемого этой функцией значения, в данном случае число ( int ) (так как длина строки измеряется числом). |
Можно переписать вышеуказанное определение функции в более общем виде:
имя функции ( тип параметра имя параметра ) : возвращаемый тип
Много функций принимают несколько параметров, например, in_array() . Её прототип выглядит так:
in_array ( mixed $needle, array $haystack , bool $strict = false ) : bool
Что это означает? in_array() возвращает boolean, true в случае успешного выполнения (если needle был найден в haystack ) или false в случае возникновения ошибки (если needle не был найден в haystack ). Первый параметр называется needle («иголка») и может принимать много различных типов, поэтому он называется «смешанным«. Этот смешанный needle (то, что мы ищем) может быть любым скалярным значением (string, integer, или float), либо массивом. haystack («стог сена», массив, в котором мы ищем) — это второй параметр. Третий необязательный параметр называется strict («строго»). Все необязательные параметры имеют значения по умолчанию; если значение по умолчанию неизвестно, оно отображается как ? Руководство указывает, что параметр strict по умолчанию принимает значение boolean false . Смотрите отдельную страницу документации по каждой функции для более подробной информации по их работе.
Символ & (амперсанд), поставленный перед параметром функции позволяет передавать значение этого параметра по ссылке:
preg_match ( string $pattern , string $subject , array &$matches = null, int $flags = 0 , int $offset = 0 ) : int|false
В данном примере мы можем использовать третий опциональный параметр &$matches , который будет передан по ссылке.
Есть также функции с более сложной информацией о версиях PHP. Возьмём для примера html_entity_decode() :
Это означает, что функция появилась в официальных версиях языка только с выхода PHP 4.3.0.
User Contributed Notes
phpinfo
Выводит большое количество информации о текущем состоянии PHP. Сюда входит информация о настройках компиляции PHP, о модулях, о версии, информация о сервере и среде выполнения (если PHP компилировался как модуль), окружении PHP, версии ОС, о путях, об основных и локальных значениях настроек конфигурации, о HTTP-заголовках и лицензии PHP.
Так как каждая система имеет свои особенности, phpinfo() используется в основном для проверки настроек конфигурации и для просмотра доступных предопределённых констант в данной системе.
phpinfo() также используется в целях отладки, так как содержит все данные EGPCS (Environment, GET, POST, Cookie, Server).
Список параметров
Вывод функции можно настраивать, передавая битовую маску из одной или более приведённых ниже констант (constants). Эта маска передаётся в качестве необязательного аргумента flags . Отдельные константы или битовые значения можно комбинировать с помощью побитового оператора ИЛИ.
Имя (константа) | Значение | Описание |
---|---|---|
INFO_GENERAL | 1 | Строка конфигурации, расположение php.ini , дата сборки, сервер, система и др. |
INFO_CREDITS | 2 | Разработчики PHP. Смотрите также phpcredits() . |
INFO_CONFIGURATION | 4 | Текущие значение основных и локальных PHP директив. Смотрите также ini_get() . |
INFO_MODULES | 8 | Загруженные модули и их настройки. Смотрите также get_loaded_extensions() . |
INFO_ENVIRONMENT | 16 | Информация о переменных окружения, которая также доступна в $_ENV . |
INFO_VARIABLES | 32 | Выводит все предопределённые переменные из EGPCS (Environment, GET, POST, Cookie, Server). |
INFO_LICENSE | 64 | Информация о лицензии PHP. Смотрите также » license FAQ. |
INFO_ALL | -1 | Выводит все приведённое выше. |
Возвращаемые значения
Функция всегда возвращает true .
Примеры
Пример #1 Пример использования phpinfo()
// Показывать всю информацию, по умолчанию INFO_ALL
phpinfo ();
// Показывать информацию только о загруженных модулях.
// phpinfo(8) выдаёт тот же результат.
phpinfo ( INFO_MODULES );
Примечания
Замечание:
В версиях PHP до 5.5, часть информации не выводится, если настройка expose_php установлена в off . Это PHP и Zend логотипы и информация о разработчиках.
Замечание:
В режиме CLI phpinfo() выводит обычный текст вместо HTML.
Смотрите также
- phpversion() — Получает текущую версию PHP
- phpcredits() — Выводит список разработчиков PHP
- ini_get() — Получает значение настройки конфигурации
- ini_set() — Устанавливает значение настройки конфигурации
- get_loaded_extensions() — Возвращает массив имён всех скомпилированных и загруженных модулей
- Предопределённые переменные
User Contributed Notes 21 notes
A simple method to style your own phpinfo() output.
ob_start () ;
phpinfo () ;
$pinfo = ob_get_contents () ;
ob_end_clean () ;
// the name attribute «module_Zend Optimizer» of an anker-tag is not xhtml valide, so replace it with «module_Zend_Optimizer»
echo ( str_replace ( «module_Zend Optimizer» , «module_Zend_Optimizer» , preg_replace ( ‘%^.*
This is necessary to obtain a W3C validation (XHTML1.0 Transitionnal).
phpinfo’s output is declared with that DTD :
— «System ID» has the wrong url to validate : «DTD/xhtml1-transitional.dtd» rather than «http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»
— Some module names contains space and the function’s output use the name in anchors as ID and NAME. these attributes can’t be validated like that (unique name only).
ob_start (); // Capturing
phpinfo (); // phpinfo ()
$info = trim ( ob_get_clean ()); // output
// Replace white space in ID and NAME attributes. if exists
$info = preg_replace ( ‘/(id|name)(=[«\’][^ «\’]+) ([^ «\’]*[«\’])/i’ , ‘$1$2_$3’ , $info );
$info_doc = new DOMDocument ( ‘1.0’ , ‘utf-8’ );
/* Parse phpinfo’s output
* operator @ used to avoid messages about undefined entities
* or use loadHTML instead
*/
@ $info_doc -> loadXML ( $info );
$doc -> documentElement -> appendChild ( // Adding HEAD element to HTML
$doc -> importNode (
$info_doc -> getElementsByTagName ( ‘head’ )-> item ( 0 ),
true // With all the subtree
)
);
$doc -> documentElement -> appendChild ( // Adding BODY element to HTML
$doc -> importNode (
$info_doc -> getElementsByTagName ( ‘body’ )-> item ( 0 ),
true // With all the subtree
)
);
// Now you get a clean output and you are able to validate.
/*
echo ($doc->saveXML ());
// OR
echo ($doc->saveHTML ());
*/
// By that way it’s easy to add some style declaration :
$style = $doc -> getElementsByTagName ( ‘style’ )-> item ( 0 );
$style -> appendChild (
$doc -> createTextNode (
‘/* SOME NEW CSS RULES TO ADD TO THE FUNCTION OUTPUT */’
)
);
// to add some more informations to display :
$body = $doc -> getElementsByTagName ( ‘body’ )-> item ( 0 );
$element = $doc -> createElement ( ‘p’ );
$element -> appendChild (
$doc -> createTextNode (
‘SOME NEW CONTENT TO DISPLAY’
)
);
$body -> appendChild ( $element );
// to add a new header :
$head = $doc -> getElementsByTagName ( ‘head’ )-> item ( 0 );
$meta = $doc -> createElement ( ‘meta’ );
$meta -> setAttribute ( ‘name’ , ‘author’ );
$meta -> setAttribute ( ‘content’ , ‘arimbourg at ariworld dot eu’ );
$head -> appendChild ( $meta );
// As you wish, take the rest of the output and add it for debugging
$out = ob_get_clean ();
$pre = $doc -> createElement ( ‘div’ ); // or pre
$pre -> setAttribute ( ‘style’ , ‘white-space: pre;’ ); // for a div element, useless with pre
$pre -> appendChild ( $doc -> createTextNode ( $out ));
$body -> appendChild ( $pre );
$doc -> formatOutput = true ; // For a nice indentation
$doc -> saveXML ();
?>
All that could be done with only RegExp but I prefer the use of DOM for manipulating documents