Функції зворотного виклику в PHP

388

Від автора: у цьому уроці я хотів би поговорити про прийом, який досить рідко використовується в створенні скриптів на мові PHP, особливо на ранніх етапах вивчення мови. Мова йде про функції швидкого виклику. Тому в даному уроці ми розглянемо, що це таке і яких видів вони бувають.

Функції зворотного виклику в PHPФункції зворотного виклику в PHP

1. Постановка задачі

Отже, давайте розглянемо наступний приклад. Є три текстових файлу, кожен з яких містить певний набір чисел. Ось вміст одного з файлів:

11
2
5
11
1
10
5
10
20

Для читання файлів передбачений спеціальний клас, наступного змісту:

class Math {
public $numbers;
public function get_numbers($files) {
if(is_array($files)) {
foreach ($files as $file) {
if(file_exists($file.”.txt”)) {
$data = file($file.”.txt”);
$this->numbers[$file] = $data;
}
}
return $this->numbers;
}
}
}
$files = array(
‘numbers_1’,
‘numbers_2’,
‘numbers_3’
);
$obj = new Math();
$result = $obj->get_numbers($files);
echo “”;
print_r($result);
echo “”;

Даний клас досить простий і містить всього один метод get_numbers(). Цей метод приймає в якості аргументу масив $files, в якому містяться імена файлів для читання. Після перевірки наявності даних файлів, що ми виконуємо їх читання, і вміст, записуємо в попередньо в змінну $data, а потім властивість $numbers. Давайте подивимося в браузері, виведе даний код:

Функції зворотного виклику в PHP

Клас своє завдання виконує, але що робити, якщо скажемо, через деякий час необхідно буде, певним чином обробляти дані, отримані з файлів. Наприклад, помножити на число, або додати рядок і т. д. При цьому доведеться переписувати код даного методу, так як він не універсальний і виконує тільки одну поставлену задачу. Тому в даному уроці ми додамо універсальності даного класу, використовуючи функції зворотного виклику.

2. Модернізація класу

Насамперед визначимося, що таке функції зворотного виклику. Функції зворотного виклику (callback) – передбачає передачу певного виконуваного коду в якості одного з параметрів для іншого коду. Тобто зворотний виклик функцій дозволяє в певному методі виконувати код, який задається в її аргументах. Функції зворотного виклику, це — як правило звичайні функції, які безпосередньо ні коли не викликаються.

Прямий виклик функції: function(). Функції зворотного виклику зазвичай передаються як параметр для іншої функції. І при цьому ми передаємо покажчик (посилання) на функцію. Зараз давайте змінимо код методу get_numbers(), наступним чином:

public function get_numbers($files, $callback = FALSE) {
if(is_array($files)) {
foreach ($files as $file) {
if(file_exists($file.”.txt”)) {
$data = file($file.”.txt”);
if(is_callable($callback)) {
$data = call_user_func($callback, $file, $data);
}
$this->numbers[$file] = $data;
}
}
return $this->numbers;
}
}

Перше, що додано – це другий необов’язковий аргумент $callback = FALSE. Це і є вказівник на посилання зворотного виклику. Який, за замовчуванням дорівнює FALSE. І друге, додана перевірка: якщо у змінній $callback міститься покажчик на функцію зворотного виклику. Значить необхідно викликати цю функцію. Для цього потрібно перевірити – а чи можна викликати функцію, покажчик на яку збережено у змінній $callback. Для цього використовується функція is_callable($callback), яка в якості аргументу приймає покажчик на функцію. Вона поверне TRUE, якщо функцію дійсно можна викликати на виконання.

Для виклику функцій зворотного виклику застосовують стандартну функцію: call_user_func($callback, $file, $data), яка першим параметром приймає покажчик на функцію, а наступними — аргументи, які повинні бути передані при виклику функції.

Таким чином, ми закладаємо при створенні методу – якусь універсальність. У потрібний момент, якщо нам необхідно буде якимось чином вплинути на дані повертаються. Нам достатньо буде створити функцію зворотного виклику і передати її покажчик в якості параметра для методу get_numbers().

3. Створення функцій зворотного виклику

Розрізняють три основних види функцій зворотного виклику:

1. Класична функція — як функція зворотного виклику. Давайте створимо таку функцію. Не забуваючи про параметри, які вона повинна приймати:

function my_callback3($file, $data) {
foreach($data as $item) {
$res = $item * 100;
$arr[] = $res.” *100″;
}
return $arr;
}

2. Статичний метод класу – як функція зворотного виклику. Давайте створимо клас і додамо в нього такий метод:

class MyClass {
public static function my_callback($file, $data) {
foreach($data as $item) {
$arr[] = $item.” from file – “.$file;
}
return $arr;
}
}

3. Звичайний метод класу – як функція зворотного виклику. Давайте додамо даний метод до раніше створеного класу MyClass:

class MyClass {
public static function my_callback($file, $data) {
foreach($data as $item) {
$arr[] = $item.” from file – “.$file;
}
return $arr;
}
public function my_callback2($file, $data) {
foreach($data as $item) {
$res = $item / 100;
$arr[] = $res.” /100″;
}
return $arr;
}
}

Тепер давайте викличемо метод get_numbers() і подивимося, як передати параметром функцію зворотного виклику, кожного з типів. Отже, як зазвичай викликати метод ми будемо наступним чином:

$result = $obj->get_numbers($files,$callback);
echo “”;
print_r($result);
echo “”;

У змінній $callback будемо зберігати вказівник на функцію зворотного виклику. Значить, для виклику кожного з типів, досить визначити дану змінну перед кодом виклику. Тепер для функції зворотного виклику першого типу:

$callback = “my_callback3”;

І відповідно на екрані ми побачимо наступне:

Функції зворотного виклику в PHP

Для другого типу:

$callback = array(“MyClass”,”my_callback”);

Так як другий тип – це статичний клас, значить у змінній $callback, необхідно зберегти масив. У першій клітинці якого, вказуємо клас, в якому описано даний статичний метод. У другій клітинці вказуємо ім’я статичного методу. На екрані ми побачимо наступне:

Функції зворотного виклику в PHP

Для третього типу:

$callback = array(new MyClass(),”my_callback2″);

Так як другий тип – це звичайний метод, значить необхідно також визначити змінну $callback масив, у першій клітинці якого зберегти об’єкт класу, в якому описаний потрібний метод. А в другій клітинці вказати ім’я методу. На екрані ми побачимо наступне:

Функції зворотного виклику в PHP

Як Ви бачите, при виклику функцій зворотного виклику ми змінюємо дія методу get_numbers(). І в завершення даного уроку, хотів би показати ще два способи, створення функцій зворотного виклику:

1. Створення анонімної функції і збереження вказівника на неї, в змінної:

$callback = function($file,$data) {
foreach($data as $item) {
$res = $item * 1000;
$arr[] = $res.” *1000″;
}
return $arr;
};

При цьому на екрані ми побачимо наступне:

Функції зворотного виклику в PHP

2. Створення функції за допомогою функції create_function() (перший параметр це рядок переданих аргументів, другий – рядок коду функції):

$callback = create_function(‘$file,$data’,’foreach($data as $item) {$res = $item / 1000;$arr[] = $res.”/1000″;}return $arr;’);

На екрані ми побачимо наступне:

Функції зворотного виклику в PHP

Як Ви бачите використання даних функцій, додає універсальності і гнучкості створюваним скриптам. Тому в деяких випадках їх дуже корисно і потрібно використовувати.

На цьому даний урок завершено. Всього Вам доброго і вдалого кодування!!!