2011-01-10 4 views
13

Есть ли способ вызова функции через переменные?php - вызов функции динамически

Например, я хочу вызвать функцию Login(). Могу ли я это сделать:

$varFunction = "Login"; //to call the function 

Могу ли я использовать $ varFunction?

+1

Да, PHP поддерживает это. Но я бы настоятельно рекомендовал не использовать его, если вы не мазохист или не планируете саботаж –

+2

привет, на самом деле причина этого в том, что я хотел бы иметь одно и то же имя функции, но для разных модулей. поэтому, например, модуль входа и модуль профиля имеют функцию вызова main() – nuttynibbles

+0

Doh! ** Наследовать ** это! –

ответ

23

Да, вы можете:

$varFunction(); 

Или:

call_user_func($varFunction); 

Убедитесь, что вы проверяете $ varFunction злонамеренного ввода.


редактировать:

Для ваших модулей, рассмотреть что-то вроде этого (в зависимости от реальных потребностей):

abstract class ModuleBase { 
    public function main() { 
    echo 'main on base'; 
    } 
} 

class ModuleA extends ModuleBase { 
    public function main() { 
    parent::main(); 
    echo 'a'; 
    } 
} 

class ModuleB extends ModuleBase { 
    public function main() { 
    parent::main(); 
    echo 'b'; 
    } 
} 

function runModuleMain(ModuleBase $module) { 
    $module->main(); 
} 

А затем вызвать runModuleMain() с правильным экземпляра модуля.

+0

эй tks .. я думаю, что буду использовать это. есть ли возможность, что веб-хостинговая компания отключит эту функцию? – nuttynibbles

+0

Это всего лишь сценарий, поэтому, если они отключить это, вы, вероятно, не сможете запустить какой-либо код. – maartenba

6

Вы можете использовать ...

$varFunction = "Login"; 
$varFunction(); 

... и это само собой разумеется, чтобы убедиться, что переменная является доверенным.

+0

Эй, это тоже работает. однако, имеет значение между этим и call_user_func(); ?? – nuttynibbles

+0

@nuttynibbles Нет, действительно, версия, о которой я упоминал, является более синтаксическим сахаром для вызова функции. Вероятно, есть некоторые незначительные отличия, но я не уверен, что. – alex

2
<?php 
    $fxname = 'helloWorld'; 

    function helloWorld(){ 
    echo "What a beautiful world!"; 
    } 

    $fxname(); //echos What a beautiful world! 
?> 
0

Вы действительно должны рассмотреть возможность использования классов для модулей, так как это позволит вам и иметь последовательную структуру коды и сохранить имена методов одинаковы для нескольких модулей. Это также даст вам гибкость в наследовании или изменении кода для каждого модуля.

По этой теме, кроме методов вызова, указанных выше (то есть, используя переменные как имена функций, или call_user_func_ * семейство функций), начиная с PHP 5.3, вы можете использовать closures, которые являются динамическими анонимными функциями, которые могут предоставить вам с альтернативным способом делать то, что вы хотите.

Смежные вопросы