Динамически вызывать статическую функцию? - PullRequest
1 голос
/ 18 ноября 2010

Может ли кто-нибудь заполнить бланк. Мне нужно вызвать статическую функцию в классе. Нужно ли использовать eval здесь?

// Some settings require function calls
$switch = array ('random_image' => 'Splashpage::get_random_image()', 'splash_photos_count' => 'Splashpage::count_splash_photos()');
foreach($switch as $key => $function) {
    if ($name == $key) {
        return ... $function
    }
}

Ответы [ 4 ]

2 голосов
/ 18 ноября 2010

Если у вас PHP 5.2.3 или новее, call_user_func() будет работать со статическими методами, переданными в этом формате:

foreach($switch as $key => $function) {
    if ($name == $key) {
        return call_user_func($function);
    }
}

Также, если вы собираетесь вернуть результат вызова методасразу же вам не нужен цикл, так как если условие получит только один шанс оценить значение true:

if (isset($switch[$name]) && is_callable($switch[$name])) {
    return call_user_func($switch[$name]);
}
1 голос
/ 18 ноября 2010

Все были отчасти правы.

Во-первых, этот массив неверен.

$switch = array ('random_image' => 'Splashpage::get_random_image()', 'splash_photos_count' => 'Splashpage::count_splash_photos()');

Должно быть:

$switch = array ('random_image' => 'Splashpage::get_random_image', 'splash_photos_count' => 'Splashpage::count_splash_photos');

Это позволяет вам звонить - как сказали 2 человека - call_user_func и покачивает вашего дядю.

$switch = array ('random_image' => 'Splashpage::get_random_image', 'splash_photos_count' => 'Splashpage::count_splash_photos');
if(isset($switch[$name])) {
    return call_user_func($switch[$name]);
}
1 голос
/ 18 ноября 2010

Если вы всегда будете вызывать эти методы в одном и том же классе, вы можете поместить только имена методов в ваш массив, а затем вызывать их так:

$switch = array ('random_image' => 'get_random_image', 'splash_photos_count' => 'count_splash_photos');
foreach($switch as $key => $function) {
    if ($name == $key) {
        return Splashpage::$function ();
    }
}
1 голос
/ 18 ноября 2010

Используйте функцию call_user_func:

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

Пример:

call_user_func('myClassName::'.$function);
...