Çözüm: PHP7 kullanın
Not: Özetlenen bir sürüm için cevabın sonundaki TL; DR bölümüne bakınız.
Eski Yöntemler
Güncelleme : Burada açıklanan eski yöntemlerden biri kaldırıldı. Diğer yöntemlerle ilgili açıklama için diğer cevaplara bakınız, burada ele alınmamıştır. Bu arada, bu cevap size yardımcı olmazsa, öğelerinizi yükseltmeye geri dönmelisiniz. PHP 5.6 desteği Ocak 2019'da sona ermiştir (şimdi PHP 7.0 ve 7.1 bile desteklenmemektedir). Daha fazla bilgi için desteklenen sürümlere bakın .
Diğerlerinin de belirttiği gibi, PHP5'te (ve ayrıca PHP7 gibi yeni sürümlerde) işlev adları, kullanım call_user_func()
ve call_user_func_array()
(kişisel olarak bu işlevlerden nefret ediyorum) vb.
Yeni Yöntemler
PHP7'den itibaren tanıtılan yeni yollar var:
Not:<something>
Köşeli ayraçların içindeki her şey, bir şey oluşturmak için bir veya daha fazla ifade <function_name>
anlamına gelir ; örneğin , bir işlev adı oluşturan ifadeler anlamına gelir.
Dinamik İşlev Çağrısı: İşlev Adı Anında
Parantez içindeki bir veya daha fazla ifadeyi işlev adı olarak tek seferde şu şekilde kullanabiliriz:
(<function_name>)(arguments);
Örneğin:
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))()();
Not: Parantezleri kaldırmak str_replace()
bir hata olmamasına rağmen, parantez koymak kodu daha okunaklı hale getirir. Ancak bunu bazen yapamazsınız, örneğin .
operatör kullanırken . Tutarlı olmak için, parantezleri her zaman koymanızı öneririm.
Dinamik Yöntem Çağrısı: Yöntem Adı Anında
Dinamik işlev çağrıları gibi, parantez yerine kıvırcık ayraçlarla çevrili yöntem çağrılarıyla aynı şekilde yapabiliriz (ekstra formlar için TL; DR bölümüne gidin):
$object->{<method_name>}(arguments);
$object::{<method_name>}(arguments);
Bir örnekte görün:
class Foo
{
public function another(): string
{
return "something";
}
}
$bar = "another thing";
(new Something())->{explode(" ", $bar)[0]}(); // something
Dinamik Yöntem Çağrısı: Dizi Sözdizimi
PHP7'ye eklenen daha zarif bir yol şudur:
[<object>, <method_name>](arguments);
[<class_name>, <method_name>](arguments); // Static calls only
Örnek olarak:
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
Not: Bu yöntemi bir öncekine göre kullanmanın yararı, arama türünü önemsememenizdir (yani statik olup olmadığı).
Ekstra Örnek: Anonim Sınıfları Kullanma
İşleri biraz karmaşık hale getirmek için, anonim sınıfların ve yukarıdaki özelliklerin bir kombinasyonunu kullanabilirsiniz :
$bar = "SomeThing";
echo (new class {
public function something()
{
return 512;
}
})->{strtolower($bar)}(); // 512
TL; DR (Sonuç)
Genellikle PHP7'de aşağıdaki formların kullanılması mümkündür:
// 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)
Çoğunlukla bu PHP konuşmasına dayanır .