Можно ли создавать временные функции / макросы в PHP? - PullRequest
2 голосов
/ 16 февраля 2011

Посмотрите на следующую иллюстрацию:

// 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 теперь будет объявлена ​​глобально, даже если она объявлена ​​внутри функции.Есть ли способ следовать этому принципу, создав крошечную функцию / макрос внутри другой функции, чтобы не засорять глобальную область видимости?Альтернативой может быть создание класса с закрытой функцией, что кажется излишним для моего использования.

Любая помощь приветствуется

Ответы [ 6 ]

3 голосов
/ 16 февраля 2011

Возможно, вы хотите замыкания , которые являются анонимными функциями.

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

Если у вас 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().

1 голос
/ 16 февраля 2011

Есть два способа сделать это. Замыкания / анонимные функции возможны из PHP 5.3, и старый способ - использовать create_function() - что довольно глупо.

Однако в вашем случае вы тоже не хотите. Нет никакой пользы в создании или воссоздании функции. Он вам нужен только один раз, так как он не зависит от состояния инициализации. Идиома, которую вы должны использовать, называется «dererred Definition» и возможна в PHP с:

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

Однако вы должны назвать его с родительской функцией в качестве префикса (например, prepare__prc), чтобы избежать конфликтов и сигнализировать о его внутреннем использовании.

Да, и между прочим, это может быть также упрощено сжато в:

$param = join("+", array_map("urlencode", split(" ", trim($param))));
1 голос
/ 16 февраля 2011

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

1 голос
/ 16 февраля 2011

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

1 голос
/ 16 февраля 2011

анонимные функции может быть тем, что вы ищете

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

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

Если вы не используете php 5.3, помните о том, что память, выделенная "create_function() "функция не освобождается, пока не завершится процесс php.Поэтому, если вы создаете много функций, у вас могут возникнуть проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...