oop — PHP Usort в родительском статическом классе с обратным вызовом в вызывающем статическом классе

У меня есть «статический класс», используемый в качестве одиночного (потому что никогда не нужно иметь несколько экземпляров), и другие классы, которые расширяют его и используются таким же образом.

В какой-то момент обработки расширенный класс вызовет parent :: doThis (), а doThis в конечном итоге сделает usort.

Обратный вызов usort должен быть в вызывающем классе, так как каждый будет обрабатывать сортировку по-своему. Может ли что-то вроде «class :: method ()» быть строкой для обратного вызова usort, и если да, есть ли способ, чтобы родительский класс узнал, какой класс вызвал его, и я не передал это в качестве аргумента, чтобы он мог назвать обратный вызов вызывающего класса для usort?

class parentClass {
protected static function doThis($data) {
// do stuff, then
usort($data, "myCallingClass::cmp()"}
}

основанный на некоторых средствах родителя, определяющих, что такое myCallingClass, или он должен быть

class parentClass {
protected static function doThis($data, $calling_class) {
// do stuff, then
usort($data, $calling_class . "::cmp()"}
}

0

Решение

Я думаю, что вы должны быть в состоянии сделать это с Поздние статические привязки:

usort($data, function($a, $b) {return(static::cmp($a, $b));});
4

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

можете добавить static function name() { return "myCallingClass"; } каждому классу со своим именем. Тогда все, что вам нужно, это позвонить

usort($data, static::name() . "::cmp()");

static modifer уверяет вас, что метод будет вызван из наследующего класса, если он есть.

2

Простое решение заключается в использовании известного имени обратного вызова в сочетании с get_called_class:

class Numbers
{
static function sort() {
$things = [1,2,3,4,5];
usort($things, [get_called_class(), 'cmp']);
print join(' ', $things);
}
}

class Mod2 extends Numbers {
static function cmp($a, $b) {
return $a % 2 - $b % 2;
}
}

Mod2::sort(); // 4 2 5 3 1

Не очень простое, но правильное решение состоит в том, чтобы забыть все эти «статические классы» и «одиночные вещи» и использовать объекты так, как они предназначены для использования:

class Numbers
{
function sort() {
$things = [1,2,3,4,5];
usort($things, [$this, 'cmp']);
print join(' ', $things);
}
}

class Mod2 extends Numbers {
function cmp($a, $b) {
return $a % 2 - $b % 2;
}
}

(new Mod2)->sort(); // 4 2 5 3 1
2
По вопросам рекламы [email protected]