Использование функций на практике в PHP

Использование функций на практике в PHP

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

В этом практическом занятии мы не будем работать под root’ом как раньше, ведь мы уже с вами для этих целей создали отдельного пользователя Linux “developer”, под которым и будем вести дальнейшее обучение. Сегодня мы закрепим знания в использовании анонимных функций, замыканий и функций определяемых пользователем. Разберемся с локальной и глобальной (родительской) областями видимости и изучим особенности определения функций.

Анонимные функции и  замыкания

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

Теперь директория learning лежит в хомяке у пользователя developer (/home/developer/learning), запустим mc и перейдем в нее:

mc
cd /home/developer/learning

Нажав F7 в midnight commander’е создадим директорию fifth_lesson

Теперь перейдем в директорию fifth_lesson и создадим там файл closures.php, вводим команды:

cd /home/developer/learning/fifth_lesson
touch closures.php

В файле closures.php напишем код, в котором мы создадим замыкание с одним входящим аргументом и использованной из глобальной (родительской) области видимости переменной, при этом замыкание будет возвращать строку с суммой значений переменных.

Файл: closures.php

<?php
$name = "Vasya";

$closure = function($sorname) use($name)
    {
        return $name . " " . $sorname;
    };

echo $closure("Pupkin");
?>

Запустим скрипт

php closures.php

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

Функции определяемые пользователем

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

Рассмотрим пример использования обычной функции в языке программирования PHP, предварительно создадим новый файл functions.php

touch functions.php

Файл: functions.php

<?php

$array = [1, 2, 3, 5, 7, 8, 0, 9, 6, 4];

function sortArray(&$array)
    {
        usort($array, function($a, $b)
            {
                if ($a === $b)
                    {
                        return 0;
                    }
                else
                    {
                        return (($a > $b) ? 1 : -1);
                    }
            });
    }

sortArray($array);
print_r($array);
?>

Результатом запуска скрипта будет…

php functions.php

Мы создали функцию sortArray(), которая ничего не возвращает, но принимает внутрь ссылку на переменную с массивом для его сортировки, функции которые ничего не возвращают так же называют процедурами. Внутри функции sortArray() мы использовали usort() для сортировки массива, в который вторым параметром передали анонимную callback функцию которая принимает два элемента $a и $b для сравнения их значений.

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

Файл: functions.php

<?php

$array = [1, 2, 3, 5, 7, 8, 0, 9, 6, 4];
sortArray($array);
print_r($array);

if (true)
    {
        function sortArray(&$array)
            {
                usort($array, function($a, $b)
                    {
                        if ($a === $b)
                            {
                                return 0;
                            }
                        else
                            {
                                return (($a > $b) ? 1 : -1);
                            }
                    });
            }
    }

?>

запускаем скрипт…

php functions.php

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

Области видимости

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

В программированииобласть видимости (англ. scope) обозначает область программы, в пределах которой идентификатор (имя) некоторой переменной продолжает быть связанным с этой переменной и возвращать её значение. За пределами области видимости тот же самый идентификатор может быть связан с другой переменной, либо быть свободным (не связанным ни с какой из них).

В большинстве языков программирования область видимости переменной определяется местом её объявления. Кроме того, область видимости может задаваться явно с помощью классов памяти или пространств имён.

Подведем итоги

Не стоит бояться сложностей в синтаксисе, их не так уж много и если разобраться в этом вопросе более подробно, то вы поймете, что функции не сложны, а даже очень удобны. Их можно заставить делать любую “грязную” работу при этом сделать код “чище”, разделив программу на смысловые блоки, которые при этом названы по названию работы, которой занимаются, что делает код читаемым. Я очень много говорю в своих статьях о читаемости кода и его чистоте – это является очень важным качеством профессионального разработчика, так как после такого разработчика у другого программиста не будет проблем с пониманием его кода, это важно в командной разработке. Да и вы сами спустя некоторое время можете не понять свой собственный код, так как вы меняетесь, получаете новый опыт и начинаете писать по-новому.

PS: И я хочу вас поздравить, мы приближаемся к ООП!

Подпишитесь на рассылку новых статей

Подпишитесь на рассылку свежих статей и присоединяйтесь к 7 остальным подписчикам.