Ostatnio w projekcie pracuję nad, musiałem przechowywać zwrotnych w statycznej tablicy członkowskim, tak jak poniżej:oddzwaniania jako części statycznej tablicy członkiem
class Example {
private static $_callbacks = array(
'foo'=>array('Example','do_foo'),
'bar'=>array('Example','do_bar')
);
private static function do_foo() { }
private static function do_bar() { }
}
do nich zadzwonić, Próbowałem oczywiste (może nawet naiwne) Składnia (wewnątrz klasy Example
):
public static function do_callbacks() {
self::$_callbacks['foo']();
self::$_callbacks['bar']();
}
Ku mojemu zaskoczeniu, to nie działa, powodując w zawiadomieniu, że jestem uzyskiwania dostępu do zmiennej niezdefiniowanej i fatalnym błędzie twierdząc, że self::$_callbacks['foo']
musiała być na żądanie.
Następnie próbowałem call_user_func
:
public static function do_callbacks() {
call_user_func(self::$_callbacks['foo']);
call_user_func(self::$_callbacks['bar']);
}
I udało się!
Moje pytanie brzmi:
Dlaczego muszę korzystać call_user_func
jako pośrednik, a nie bezpośrednio do nich zadzwonić?
Oh wow, masz rację: to nie działa! To naprawdę dziwne, ponieważ kiedy początkowo próbowałem dowiedzieć się, dlaczego mój oryginał nie działał, spróbowałem tego i zadziałało. W takim razie wyciągnę to z mojego pytania. –