PHP создать функцию из строкового значения - PullRequest
1 голос
/ 13 февраля 2011

Я просто хочу создать имя функции со строковым значением.

Примерно так:

$ns = 'test';
function $ns.'_this'(){}
test_this();

Конечно, выдает ошибку.

Я пробовал с:

function {$ns}.'_this'
function {$ns.'_this'}

но не повезло.

Есть мысли?

Ответы [ 5 ]

4 голосов
/ 13 февраля 2011

Вы можете использовать create_function для создания функции из указанной строки.

Пример (php.net)

<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
// outputs
// New anonymous function: lambda_1
// ln(2) + ln(2.718281828459) = 1.6931471805599
?>
2 голосов
/ 13 февраля 2011

файл с функцией (somefile.php)

function outputFunctionCode($function_name)
{?>
    function <?php echo $function_name ?>()
    {
    //your code
    }
<?php }

файл с кодом, который «объявляет» функцию:

ob_start();
include("somefile.php");
outputFunctionCode("myDynamicFunction");
$contents = ob_get_contents();
ob_end_clean();
$file = fopen("somefile2.php", "w");
fwrite($file,$contents);
fclose($file);
include("somefile2.php");

Это некрасиво, но опять же, крайне плохо объявлять функции с динамическими именами.

2 голосов
/ 13 февраля 2011

Это не возможно.Если все, что вы хотите сделать, это поставить перед всеми обычными строками префикс, возможно, вы хотите использовать пространства имен?

namespace foo {
    function bar() {}
    function rab() {}
    function abr() {}
}
// access from global namespace is as follows:
namespace {
    foo\bar(); foo\rab(); foo\abr();
}
1 голос
/ 13 февраля 2011

использование «eval» не является хорошей практикой, но иногда это может служить цели, аналогичной вашим требованиям.

   <?php

 $ns = 'test';
 $funcName = $ns.'_this';
    eval("function $funcName(){ echo 1;}");
    test_this();

?>
0 голосов
/ 13 февраля 2011

Это то, что вы ищете?

<?php

function foo($a) {   print 'foo called'.$a; }

$myfunctionNameStr = 'foo';

$myfunctionNameStr(2);

?>

Потому что я не думаю, что вы можете динамически создать объявление функции.Вы можете определить во время выполнения значение $ myfunctionNameStr.

...