Какая польза от обратных вызовов / вызовов в PHP?

Я пытаюсь понять, что такое обратные вызовы или что они делают в PHP.

Я видел документацию, но для чего они полезны?

Есть ли что-то, что делают обратные вызовы, что нельзя сделать в простых функциях?

0

Решение

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

Это можно определить с помощью стандартной функции PHP, которую мы создали

$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];

function dateSort($a, $b) {
return $a->myDate <=> $b->myDate;
}

usort($data, 'dateSort');
var_dump($data);

или используя анонимную функцию

$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];

usort($data, function($a, $b) { return $a->myDate <=> $b->myDate; });
var_dump($data);

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


Анонимные функции дают нам гораздо большую гибкость: обратный вызов, используемый многими функциями массива, такими как usort() или же array_filter() автоматически получает определенные аргументы от функции, например, usort() передается два значения из массива для упорядочения … не проблема, если вы просто сравниваете эти два значения, вы можете создать простую функцию и использовать ее; но что произойдет, если мы хотим отсортировать, разворачивается вокруг определенного значения, как 2016-12-31поэтому мы сортируем количество дней до / с этой даты; нам нужна новая функция, в которой эта дата жестко запрограммирована в качестве основного значения:

$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];

function dateSort($a, $b) {
return abs(strtotime('2016-12-31') - strtotime($a->myDate)) <=> abs(strtotime('2016-12-31') - strtotime($b->myDate));
}

usort($data, 'dateSort');
var_dump($data);

А теперь перейдем к интересной части: что произойдет, если мы захотим динамически распределить значение даты разворота? Мы не можем передать дополнительные аргументы usort() обратный вызов, так как мы можем передать сводное значение «2017-01-06» или «2017-12-26» во время выполнения? Здесь анонимный обратный вызов особенно полезен, потому что мы можем легко передать дополнительные аргументы анонимной функции через use:

$data = [
(object) ['myDate' => '2017-01-12'],
(object) ['myDate' => '2016-12-25'],
(object) ['myDate' => '2017-01-01'],
];$pivotDate = '2017-01-06';
usort(
$data,
function ($a, $b) use ($pivotDate){
return abs(strtotime($pivotDate) - strtotime($a->myDate)) <=> abs(strtotime($pivotDate) - strtotime($b->myDate));
});
var_dump($data);
2

Другие решения

Других решений пока нет …