2011-02-16 43 views
2

看看如下圖所示:可以在PHP中創建臨時函數/宏嗎?

// Trims input, fixes spaces and encodes bad glyphs. Also works with arrays. 
function prepare_param($param) 
{ 
    $retval = ""; 

    function prc($param) 
    { 
     $r = split(" ", trim($param)); 
     foreach($r as $i => $e) 
      $r[$i] = urlencode($e); 
     return join("+", $r); 
    } 

    // If input is an array 
    if(is_array($param)) 
    { 
     $retval = array(); 

     foreach($param as $e) 
      $retval[] = prc($e); 
    } 
    // If input is a string 
    else if(is_string($param)) 
    { 
     return prc($param); 
    } 
    else throw new Exception("Invalid input! Expected String or Array."); 
} 

顯然功能prc現在將全局聲明,即使在函數內部聲明。有沒有辦法遵循這個原則,在另一個函數內部創建一個小函數/宏,以免亂丟全局範圍?另一種方法是用私有函數創建一個類,這對於我的使用來說似乎過分了。

任何幫助表示讚賞

回答

2

如果你有PHP 5.3,輸入匿名函數:

$prc = function($param) 
{ 
    $r = split(" ", trim($param)); 
    foreach($r as $i => $e) 
     $r[$i] = urlencode($e); 
    return join("+", $r); 
}; 

if(is_array($param)) 
{ 
    $retval = array(); 

    foreach($param as $e) 
     $retval[] = $prc($e); 
} 
else if(is_string($param)) 
{ 
    return $prc($param); 
} 

在這種情況下,只有$prc住在你的prepare_param()功能的範圍。

3

你可能想closures,這是匿名函數。

+0

迂腐注:閉包是在閉包匿名函數不同的包括範圍。在PHP中,所有閉包都是匿名函數,但並非所有匿名函數都是閉包。如果包含`use($ var)`聲明(但PHP的文檔和內部表示將它們視爲相同),它只是一個真正的閉包... – ircmaxell 2011-02-16 19:09:01

1

anonymous functions可能是你在找什麼

<?php 
$greet = function($name) 
{ 
    printf("Hello %s\r\n", $name); 
}; 

$greet('World'); 
$greet('PHP'); 
?> 

如果你不使用PHP 5.3請注意一個事實,即由「create_function()」功能分配的內存沒有釋放,直到PHP過程完成。所以如果你創建了很多功能,你可能會遇到問題。

1

有兩種方法可以做到這一點。封閉/匿名函數可能來自PHP 5.3,老式的方式將使用create_function() - 這是非常糟糕的。

但在你的情況下,你不想要。創建或重新創建函數沒有任何好處。你只需要一次,因爲它不依賴於任何初始化狀態。你應該使用這個成語叫「dererred定義」,並有可能在PHP搭配:

if (!function_exists("prc")) { 
    function prc($param) { 
     ... 
    } 
} 

您應該作爲前綴然而其父功能(例如prepare__prc),以避免衝突,以突出其內部使用的名字。

哦,順便說一句,並也有可能是簡化壓縮成:

$param = join("+", array_map("urlencode", split(" ", trim($param)))); 
相關問題