Я пытаюсь понять, что такое обратные вызовы или что они делают в PHP.
Я видел документацию, но для чего они полезны?
Есть ли что-то, что делают обратные вызовы, что нельзя сделать в простых функциях?
Обратные вызовы используются, чтобы позволить нам применять пользовательскую логику к общим функциям, таким как 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);
Других решений пока нет …