2011-02-13 176 views
0

我只是簡單地想創建一個帶有字符串值的函數名稱。php從字符串值創建函數

事情是這樣的:

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

當然它拋出一個錯誤。

我已經試過:

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

,但沒有運氣。

有什麼想法?

回答

2

這是不可能。如果你想要做的只是將所有函數加上一些常用的字符串,那麼你可能想要使用命名空間?

namespace foo { 
    function bar() {} 
    function rab() {} 
    function abr() {} 
} 
// access from global namespace is as follows: 
namespace { 
    foo\bar(); foo\rab(); foo\abr(); 
} 
+0

呃,我已經用命名空間走了那條路。我告訴你,php命名空間是可怕的。無論如何,我想這就是我想知道的是,它不能完成。 – 2011-02-13 10:04:12

4

您可以使用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 
?> 
+0

對,我看着那個。我仍然希望能夠以傳統方式調用該功能,這是不允許的。 – 2011-02-13 09:59:51

0

這是你在找什麼?

<?php 

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

$myfunctionNameStr = 'foo'; 

$myfunctionNameStr(2); 

?> 

因爲我不認爲你可以動態地構造函數聲明。你可以在'運行時'決定$ myfunctionNameStr的值。

2

文件與功能(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"); 

這是醜陋的,但話又說回來,這是一個非常糟糕的主意申報功能與動態名稱。

+0

同意,醜可能,但它確實做OP的問 – SeanDowney 2013-03-25 18:36:44

1

使用「eval」不是一種好的做法,但這可能有助於達到與您的要求類似的目的。

<?php 

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

?>