Rozwiązanie: użyj PHP7
Uwaga: Aby uzyskać podsumowaną wersję, patrz TL; DR na końcu odpowiedzi.
Stare metody
Aktualizacja : Jedna ze starych opisanych tutaj metod została usunięta. Wyjaśnienia na temat innych metod można znaleźć w innych odpowiedziach, które nie są tutaj omówione. Nawiasem mówiąc, jeśli ta odpowiedź ci nie pomoże, powinieneś zaktualizować swoje rzeczy. Obsługa PHP 5.6 zakończyła się w styczniu 2019 r. (Obecnie nawet PHP 7.0 i 7.1 nie są obsługiwane). Aby uzyskać więcej informacji, zobacz obsługiwane wersje .
Jak wspomniano inni, w PHP5 (a także w nowszych wersjach, takich jak PHP7) możemy używać zmiennych jako nazw funkcji, używać call_user_func()
icall_user_func_array()
(które osobiście nienawidzę tych funkcji) itp.
Nowe metody
Od PHP7 wprowadzono nowe sposoby:
Uwaga: Wszystko w <something>
nawiasach oznacza jedno lub więcej wyrażeń, aby coś utworzyć, np. <function_name>
Oznacza wyrażenia tworzące nazwę funkcji.
Dynamiczne wywołanie funkcji: nazwa funkcji w locie
Możemy użyć jednego lub więcej wyrażeń w nawiasach jako nazwy funkcji za jednym razem, w postaci:
(<function_name>)(arguments);
Na przykład:
function something(): string
{
return "something";
}
$bar = "some_thing";
(str_replace("_", "", $bar))(); // something
// Possible, too; but generally, not recommended, because makes your code more complicated
(str_replace("_", "", $bar))()();
Uwaga: Chociaż usunięcie nawiasów wokoło str_replace()
nie jest błędem, umieszczenie nawiasów czyni kod bardziej czytelnym. Czasami jednak nie możesz tego zrobić, np. Podczas używania.
operatora. Aby zachować spójność, zawsze zaleca się umieszczanie nawiasów.
Dynamiczne wywołanie metody: nazwa metody w locie
Podobnie jak dynamiczne wywołania funkcji, możemy zrobić to samo z wywołaniami metod, otoczonymi nawiasami klamrowymi zamiast nawiasów (w przypadku dodatkowych formularzy przejdź do sekcji TL; DR):
$object->{<method_name>}(arguments);
$object::{<method_name>}(arguments);
Zobacz to w przykładzie:
class Foo
{
public function another(): string
{
return "something";
}
}
$bar = "another thing";
(new Something())->{explode(" ", $bar)[0]}(); // something
Dynamiczne wywołanie metody: składnia macierzy
Bardziej elegancki sposób dodany w PHP7 jest następujący:
[<object>, <method_name>](arguments);
[<class_name>, <method_name>](arguments); // Static calls only
Jako przykład:
class Foo
{
public function nonStaticCall()
{
echo "Non-static call";
}
public static function staticCall()
{
echo "Static call";
}
}
$x = new X();
[$x, "non" . "StaticCall"](); // Non-static call
[$x, "static" . "Call"](); // Static call
Uwaga: Zaletą korzystania z tej metody w porównaniu z poprzednią jest to, że nie obchodzi Cię typ połączenia (tj. Czy jest statyczny czy nie).
Dodatkowy przykład: korzystanie z anonimowych klas
Sprawiając nieco komplikację, możesz użyć kombinacji anonimowych klas i powyższych funkcji:
$bar = "SomeThing";
echo (new class {
public function something()
{
return 512;
}
})->{strtolower($bar)}(); // 512
TL; DR (Podsumowanie)
Ogólnie rzecz biorąc, w PHP7 możliwe są wszystkie następujące formularze:
// Everything inside `<something>` brackets means one or more expressions
// to form something
// Dynamic function call
(<function_name>)(arguments)
// Dynamic method call on an object
$object->{<method_name>}(arguments)
$object::{<method_name>}(arguments)
// Dynamic method call on a dynamically-generated object
(<object>)->{<method_name>}(arguments)
(<object>)::{<method_name>}(arguments)
// Dynamic method call, statically
ClassName::{<method_name>}(arguments)
(<class_name>)::{<method_name>}(arguments)
// Dynamic method call, array-like (no different between static and non-static calls
[<object>, <method_name>](arguments)
// Dynamic method call, array-like, statically
[<class_name>, <method_name>](arguments)
Oparte głównie na tej rozmowie PHP .