Bir değişken içinde depolanan dize PHP işlevi nasıl

10 Cevap php

Ben bir işlevi çağırmak için gerekiyor, ama işlev adı bir değişken içinde saklanır, bu mümkün mü? örn:

function foo ()
{
  //code here
}

function bar ()
{
  //code here
}

$functionName = "foo";
// i need to call the function based on what is $functionName

Anyhelp harika olurdu.

Teşekkürler!

10 Cevap

Doğru cevap evet, bu mümkün olduğunu:

function foo($msg) {
    echo $msg."<br />";
  }
  $var1 = "foo";
  $var1("testing 1,2,3");

Source: http://www.onlamp.com/pub/a/php/2001/05/17/php_foundations.html?page=2

Bütünlüğü uğruna, siz de kullanabilirsiniz eval():

$functionName = "foo()";
eval($functionName);

Ancak, call_user_func() doğru yoldur.

Onlar bir sınıf içinde bir yöntem için bir değişken kullanmaya çalışıyor çünkü durumda başkasının google tarafından buraya getirilen, aşağıda aslında çalışacak bir kod örneği. Yukarıdakilerin hiçbiri benim durum için çalıştı. Önemli fark $c = & new... ve &$c call_user_func içinde geçirilen bildiriminde & olduğunu.

Csscolor.php sınıftan renk ve iki üye yöntemleri lighten() ve darken() ile yapmak zorunda birinin kodunu uygularken Benim özel bir durum. Sebebi ne olursa olsun, ben aynı kod veya koyulaştırmak yerine mantığı ile bunu seçmek aramak mümkün olmasını istedik. Bu sadece bu yöntemi çağırmadan kodunu değiştirmek için if-else veya kullanmak değil benim inatlaşma sonucu olabilir.

$lightdark="lighten"; // or optionally can be darken
$color="fcc";   // a hex color
$percent=0.15;  
include_once("csscolor.php");
$c = & new CSS_Color($color);
$rtn=call_user_func( array(&$c,$lightdark),$color,$percent);

Bir şey ile çalışıyor $c->{...} işe yaramadı unutmayın. Üzerinde php.net 'in sayfanın altındaki okuyucu-katkıda içeriğini incelemeden sonra call_user_func, ben yukarıdaki araya başardı. Ayrıca, bu $params didn't work Benim için bir dizi olarak dikkat:

// This doesn't work:
$params=Array($color,$percent);
$rtn=call_user_func( array(&$c,$lightdark),$params);

Bu, yukarıda girişimi 2 argüman (yüzde) bekliyor yöntemi hakkında bir uyarı verecek.

Daha önce de belirttiğimiz gibi, muhtemelen güvenli yöntem ile bunu başarmak için birkaç yolu vardır olmak call_user_func() ya da rota aşağı gidebilir gerekiyorsa $function_name(). O yüzden bu yöntemlerin her ikisini de kullanarak argüman geçmek mümkündür

$function_name = 'foobar';

$function_name(arg1, arg2);

call_user_func_array($function_name, array(arg1, arg2));

Aradığınız işlev bir nesneye aitse yine bunlardan birini kullanabilirsiniz

$object->$function_name(arg1, arg2);

call_user_func_array(array($object, $function_name), array(arg1, arg2));

Eğer işlev adının varlığını sınamak için iyi bir fikir olabilir $function_name() yöntemi kullanmak için gidiyoruz eğer Ancak dinamik herhangi bir şekilde olduğunu

if(method_exists($object, $function_name))
{
    $object->$function_name(arg1, arg2);
}

Benim favori sürümü inline versiyonu:

${"variableName"} = 12;

$className->{"variableName"};
$className->{"methodName"}();

StaticClass::${"variableName"};
StaticClass::{"methodName"}();

Siz de parantez içinde değişkenleri veya ifadeler yerleştirebilirsiniz!

Call_user_func işlevini kullanın.

Bu şekilde uzun vadede korumak için bu proje / Kod çok sert yapacak kod çalışıyor ve bunun bir baş ağrısı daha sonra ihtiyaç yapacaktır. Eğer sadece işlev adı arayamazsın neden ben yukarıda açıklanan yöntemlerden herhangi biri gibi yapmak kadar kolay olurdu, bilmiyorum. Hiç iki basit cevaplar için her iki kod örnekleri +1 :)

Dynamic function names and namespaces

Ad alanlarını kullanırken sadece dinamik işlev isimleri hakkında bir nokta eklemek için.

Eğer ad kullanıyorsanız, the following won't work işlev genel ad ise hariç:

namespace greetings;

function hello()
{
    // do something
}

$myvar = "hello";
$myvar(); // interpreted as "\hello();"

What to do?

Yerine call_user_func() kullanmak zorunda:

// if hello() is in the current namespace
call_user_func(__NAMESPACE__.'\\'.$myvar);

// if hello() is in another namespace
call_user_func('mynamespace\\'.$myvar);

I dont know why u have to use that, doesnt sound so good to me at all, but if there are only a small amount of functions, you could use a if/elseif construct. I dont know if a direct solution is possible.

something like $foo = "bar"; $test = "foo"; echo $$test;

bar dönmek gerekir, bu işlevler için çalışacağını düşünüyorum etrafında deneyebilirsiniz ama Yüklü