Как я могу создать функцию динамически?

У меня есть переменная типа $string = "blah";

Как создать функцию, которая имеет значение переменной как имя? Возможно ли это в PHP?

Как function $string($args){ ... }или что-то, и иметь возможность называть его так:

blah($args);

php,function,

11

Ответов: 5


9 принят

Это не похоже на отличный дизайн, возможно, стоит переосмыслить его, но ...

Если вы используете PHP 5.3, вы можете использовать анонимную функцию.

<?php
$functionName = "doStuff";
$$functionName = function($args) {
    // Do stuff
};

$args = array();
$doStuff($args);
?>

13

это может быть не очень хорошая идея, но вы можете сделать что-то вроде этого:

$string = "blah";
$args = "args"
$string = 'function ' . $string . "({$args}) { ... }";
eval($string);

1

Вы можете вызвать функцию по имени, хранящемуся в переменной, и вы также можете назначить функцию переменным и вызвать ее с помощью переменной. Если это не то, что вы хотите, объясните больше.


1

Пытаться call_user_func_array()

Ссылка на php.net


0

Расширение fardjad ответа «s, я рекомендовал бы этот подход:

// you only need this part once
$DeclarationSyntax = '

    function %s() {
        $name = __FUNCTION__;
        $func = $GLOBALS["Lambda"][$name];
        call_user_func_array($func,func_get_args());
    }

';

// define your stuff as lambda functions
$Lambda["hello"] =
    function($what) {
        print "Hello $what, as Ritchie said<br>";
    }
;
$Lambda["goodbye"] =
    function($what,$when) {
        print "Goodbye cruel $what, I'm leaving you $when<br>";
    }
;

// copy them as normal functions
foreach(array_keys($Lambda) as $name) {
    $name = preg_replace('/[^a-zA-Z0-9_]/',"",$name); // just for safety
    eval(sprintf($DeclarationSyntax,$name));          // where the magic happens
}


// and now you can use them:

hello('world');
goodbye('world','today');

Это имеет много преимуществ; во-первых, он работает со многими функциями, не повторяя себя. Что еще более важно, ошибки компилятора будут отображаться так, как вы ожидали, с номерами строк и всего, а не просто «что-то не так внутри eval». Кроме того, вам не нужно беспокоиться о котировках, благодаря функциям лямбда.

Имейте в виду, что вы используете глобальные переменные здесь; eval должен вызываться из глобальной области для создания функций так, как вам нужно.

PHP функция,
Похожие вопросы
Яндекс.Метрика