簡體   English   中英

可以在PHP中創建臨時函數/宏嗎?

[英]Can temporary functions/macros be created in 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現在將被全局聲明,即使在函數內聲明。 有沒有辦法遵循這個原則,在另一個函數內創建一個微小的函數/宏,以免亂丟全局范圍? 另一種方法是創建一個具有私有函數的類,這對我的使用來說似乎有些過分。

任何幫助贊賞

您可能需要閉包 ,這是匿名函數。

如果您有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()函數的范圍內。

匿名函數可能是您正在尋找的

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

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

如果你不使用php 5.3,請注意這個事實是“ create_function() ”函數分配的內存在php進程完成之前不會被釋放。 因此,如果您創建了許多功能,那么您可能會遇到問題。

如果您有權訪問> = PHP 5.3,則可以使用匿名函數 ,如果沒有,則可以使用create_function

如果您沒有PHP 5.3,則可以使用create_function函數。

有兩種方法可以做到這一點。 PHP 5.3中可以使用閉包/匿名函數,而oldschool的方法是使用create_function() - 這非常難看。

但是在你的情況下,你也不想要。 創建或重新創建功能沒有任何好處。 您只需要一次,因為它不依賴於任何初始化狀態。 你應該使用的習語稱為“dererred definition”,並且可以在PHP中使用:

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

你應該用它的父函數命名它作為前綴(例如prepare__prc )以避免沖突並指示其內部使用。

哦,順便說一句,它也可以簡化為:

$param = join("+", array_map("urlencode", split(" ", trim($param))));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM