PHP ile bir nesne üzerinde değişen bir işlev adını çağırarak: nasıl?

4 Cevap

Nasıl böyle bir şey yapardı:

class Test
{

    public function test($methodName) {
    	$this->$methodName;
    }

    private function a() {
    	echo("a");
    }

    private function b() {
    	echo("b");
    }

}

$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");

Belki sadece bir parametre "TİP" geçmek ve "IF deyimini" kullanın ama ben sadece merak ediyorum gerekir! :)

Ve ne "dinamik işlev adı" bir veya daha fazla parametre varsa?

GÜNCELLEME: herkese teşekkürler! :)

UPDATE #2 - Answer :

class Test
{

    public function testOut($methodName) {
        $this->$methodName();
    }

    private function a() {
        echo("a");
    }

    private function b() {
        echo("b");
    }

}

$testObj = new Test();
$testObj->testOut("a");
$testObj->testOut("b");

Sınıfı ile sorun "Test" (sınıf adı olarak aynı) adında bir yöntem vardı ki ... Ben değiştirdim ve çalıştı.

4 Cevap

Ne istediğinizi yapmalıyım - call_user_func() göz atın.

Documentation here

call_user_func bu gibi şeyler yapmanızı sağlar.

Örneğin,

funcname = 'a';
call_user_func(array($testObj, $funcname));

Diğer alternatif kullanmak için variable methods

Örneğin,

$funcname = 'a';
$testObj->$funcname();

Eğer birden fazla parametre ile bir "dinamik bir işlev adı" varsa, bu gibi call_user_func_array kullanabilirsiniz:

//in class context..
//$parameters can be an array like array(1,2)
call_user_func_array(array($this, $methodName), $parameters);

Yerine call_user_func bir call_user_func_array kullanmak isteyeyim nedeni kolayca bağımsız değişken bir dizi için izin böylece, bunun yerine sadece gibi ek parametrelerin fonksiyonu bir dizi olarak alır parametrelerini geçmek olabilir.

Belirli bir örnek ve kullanım durumunda takiben, tam olarak bunu başarmak için tek yol:

$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");

kullanmak olacaktır eval(),

class Test
{

    public function test($methodName) {
        eval($methodName);
    }

    private function a() {
        echo("a");
    }

    private function b() {
        echo("b");
    }

}

$testObj = new Test();
$testObj->test("a()");
$testObj->test("b()");

Diğerleri call_user_func() ve haklı bir şekilde kullanarak bir çözüm işaret etti. Ayrıca besbelli, işlev çağrıları için eval () kullanarak daha hızlıdır. Bu Oku:

http://nz.php.net/manual/en/function.call-user-func.php#64415