Skip to content

Основы PHP: Функции

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

Определение пользовательских функций

Для определения собственной функции используется ключевое слово function, за которым следует имя функции, список параметров в круглых скобках () и тело функции, заключенное в фигурные скобки {}.

php
<?php
function имяФункции($параметр1, $параметр2, ...) {
    // Тело функции: код, который будет выполнен при вызове функции
    // Может содержать операторы, управляющие структуры, другие функции и т.д.
}
?>
  • function: Ключевое слово, указывающее на определение функции.
  • имяФункции: Уникальное имя, которое вы даете своей функции. Имена функций не чувствительны к регистру, но рекомендуется использовать строчные буквы для единообразия.
  • ($параметр1, $параметр2, ...): Необязательный список параметров (аргументов), которые функция может принимать при вызове. Параметры — это переменные, которые получают значения, переданные при вызове функции.
  • {}: Фигурные скобки, заключающие тело функции — блок кода, который выполняется при вызове функции.

Пример простой функции

php
<?php
function sayHello($name) {
    echo "Привет, " . $name . "!\n";
}

// Вызов функции sayHello
sayHello("Алиса"); // Выведет: Привет, Алиса!
sayHello("Боб");   // Выведет: Привет, Боб!
?>

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

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

Параметры по умолчанию

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

php
<?php
function greet($name = "Гость") {
    echo "Привет, " . $name . "!\n";
}

greet("Чарли"); // Выведет: Привет, Чарли!
greet();      // Выведет: Привет, Гость! (использовано значение по умолчанию)
?>

Типизация параметров (Type Hinting)

PHP позволяет указывать ожидаемый тип данных для параметров функции. Это называется "типизация параметров" (type hinting). Если при вызове функции передан аргумент неверного типа, PHP выдаст ошибку (TypeError в строгом режиме, Warning в обычном).

php
<?php
function multiply(int $num1, float $num2): float {
    return $num1 * $num2;
}

echo multiply(5, 2.5);   // Выведет: 12.5
// echo multiply("5", 2.5); // Выдаст TypeError в строгом режиме
?>

Поддерживаются следующие типы для типизации параметров: int, float, string, bool, array, object, имена классов, имена интерфейсов, callable, iterable, self, parent. Также можно использовать ? перед типом, чтобы указать, что параметр может быть null (?string, ?int и т.д.).

Передача параметров по значению и по ссылке

По умолчанию параметры в PHP передаются по значению. Это означает, что внутри функции создается копия переданной переменной, и изменения этой копии не влияют на исходную переменную, переданную при вызове функции.

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

php
<?php
// Передача по значению
function incrementByValue($count) {
    $count++;
    echo "Внутри функции (по значению): " . $count . "\n";
}

$counter1 = 10;
incrementByValue($counter1);
echo "Вне функции (по значению): " . $counter1 . "\n";
// Выведет:
// Внутри функции (по значению): 11
// Вне функции (по значению): 10

// Передача по ссылке
function incrementByReference(&$count) {
    $count++;
    echo "Внутри функции (по ссылке): " . $count . "\n";
}

$counter2 = 20;
incrementByReference($counter2);
echo "Вне функции (по ссылке): " . $counter2 . "\n";
// Выведет:
// Внутри функции (по ссылке): 21
// Вне функции (по ссылке): 21
?>

Аргументы переменной длины

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

  1. Использование func_num_args(), func_get_arg(), func_get_args(): Эти функции предоставляют доступ к аргументам, переданным в функцию, независимо от того, сколько параметров было определено.

    php
    <?php
    function sumAll() {
        $sum = 0;
        $numArgs = func_num_args();
        for ($i = 0; $i < $numArgs; $i++) {
            $sum += func_get_arg($i);
        }
        return $sum;
    }
    
    echo sumAll(1, 2, 3);     // Выведет: 6
    echo sumAll(10, 20, 30, 40); // Выведет: 100
    ?>
  2. Использование оператора ... (spread operator) в определении функции (PHP 5.6+): Этот синтаксис позволяет собрать все переданные аргументы в массив.

    php
    <?php
    function multiplyAll(...$numbers) {
        $product = 1;
        foreach ($numbers as $number) {
            $product *= $number;
        }
        return $product;
    }
    
    echo multiplyAll(2, 3, 4);       // Выведет: 24
    echo multiplyAll(5, 10, 2);      // Выведет: 100
    ?>

Возвращение значений из функции

Функция может возвращать значение обратно в место, где она была вызвана, с помощью оператора return. Вы можете вернуть любое значение, включая скалярные типы, массивы, объекты и т.д.

php
<?php
function add($num1, $num2) {
    $sum = $num1 + $num2;
    return $sum;
}

$result = add(15, 7);
echo "Результат сложения: " . $result . "\n"; // Выведет: Результат сложения: 22

function getFullName($firstName, $lastName) {
    return $firstName . " " . $lastName;
}

$fullName = getFullName("Иван", "Петров");
echo "Полное имя: " . $fullName . "\n"; // Выведет: Полное имя: Иван Петров
?>

Типизация возвращаемых значений (Return Type Declaration)

Начиная с PHP 7, вы можете указывать ожидаемый тип возвращаемого значения после списка параметров, используя двоеточие : и затем тип данных.

php
<?php
function divide(float $dividend, float $divisor): float {
    if ($divisor === 0) {
        return 0.0; // Или можно выбросить исключение
    }
    return $dividend / $divisor;
}

echo divide(10.0, 2.0); // Выведет: 5
// echo divide(10, "2"); // Выдаст TypeError в строгом режиме
?>

Область видимости функций

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

Функции, определенные внутри классов, являются методами класса и имеют свою собственную область видимости (связанную с классом и его экземплярами).

Встроенные функции PHP

PHP предоставляет огромное количество встроенных функций для выполнения различных задач, таких как работа со строками (strlen(), strpos(), str_replace()), массивами (count(), array_push(), array_pop()), файловой системой (file_get_contents(), file_put_contents()), базами данных, датой и временем и многими другими.

Примеры встроенных функций:

php
<?php
$text = "Пример строки";
echo "Длина строки: " . strlen($text) . "\n"; // Выведет: Длина строки: 12

$numbers = [1, 5, 2, 8, 3];
echo "Количество элементов в массиве: " . count($numbers) . "\n"; // Выведет: Количество элементов в массиве: 5

echo "Текущая дата и время: " . date('Y-m-d H:i:s') . "\n";
?>

Использование функций — как пользовательских, так и встроенных — является ключевым для написания эффективного, организованного и многократно используемого PHP-кода.