Правильный способ внедрения и использования именованной функции в классе / объекте?

Какова общая практика, когда нужно внедрить нормальную именованную функцию в класс / объект? Я могу ввести анонимную функцию / замыкание, созданное с помощью function() {} но в большинстве случаев я могу предпочесть традиционные статические функции.

Например, я хочу ввести именованную функцию как Some::func() в классе Test, Я просто передаю имя функции в виде строки? Или есть другой способ получше?

Это то, что я придумала до сих пор:

class Test {
private $func;
public function __construct($func) {
$this -> func = array(
'name' => $func
);
}
public function run() {
$this -> func['name']();
}
public function run2() {
Some::func();
}
public function run3() {
call_user_func_array($this -> func['name'], array());
}
}

class Some {
static function func() {
echo 'Success!';
}
}

$test = new Test('Some::func');
$test -> run(); // Call to undefined function Some::func()
$test -> run2(); // Works!
$test -> run3(); // Works!

Первый run() выглядит намного лучше, хотя и не работает. И ошибка звучит странно для меня, потому что Some::func() там определенно определены как другие способы работы должным образом.

Мне кажется call_user_func_array() единственный способ здесь? Есть ли способ сделать первый подход run() Работа? Если нет, то почему?

0

Решение

Комментарий от @bitWorking вдохновил меня. Кажется, это можно сделать так:

$test = new Test(array('Some', 'func'));
$test -> run(); // Works!
$test -> run2(); // Works!
$test -> run3(); // Works!

Вместо прохождения 'Some::func'нужно пройти array('Some', 'func') за это.

0

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector