Jeśli chcesz po prostu się odnieść do różnych funkcji po nazwie, to możesz to zrobić tak:
Kopiuj
<?php
$functions = [
'greeting' => function (): void {
echo "Welcome friend! " . $argument;
},
'bye' => function (): void {
echo "Bye!";
},
'inspect' => function (): void {
var_dump($argument);
}
];
$name = 'greeting'; // albo 'bye', albo 'inspect'
$function = $functions[$name];
$function();
To byłby najlepszy sposób żeby to zrobic.
Jeśli jednak bardzo chcesz zrobić to w sposób w który podałeś, to nie możesz zawołać funkcja_wewnetrzna bez klasy (bo to jest funkcja w klasie). Musisz ją wywołać na jakimś obiekcie, np tak:
Kopiuj
<?php
class MyClass
{
function addMethod($nazwa, $metoda)
{
$this->$nazwa = Closure::bind($metoda, $this);
}
public function __call($nazwa, $a)
{
return call_user_func($this->$nazwa, $a);
}
public function funkcja_wewnetrzna()
{
return 'HELLO';
}
}
$my = new MyClass();
$my->addMethod("test", function ($a) {
return $this->funkcja_wewnetrzna();
});
echo $my->{"test"}(2);
Przy czym to rozwiązanie jest słabe, bo np nie jesteś w stanie z zrobić żeby funkcja_wewnetrzna() była prywatna, więc bardzo odradzałbym Ci takie podejście. Najlepiej by było gdybyś napisał co chcesz osiągnąć.