указать как передавать неограниченные аргументы по ссылке в php



php типизированные параметры функции (7)

У меня есть функция php, которая имеет неограниченное количество аргументов, которые я получаю от func_get_args (). У меня есть некоторые операции с аргументами (изменение строки или выполнение чего-то), и я хочу, чтобы это было как передающий аргумент по ссылке. Является ли это возможным?

пример:

$test = 'foo';
$test2 = 'bar';

function test(){
    $args = func_get_args();
    foreach($args as $arg)
        $arg .= 'baz';
}

test($test, $test2);

Answer #1

Это работает:

$test = 'foo';
$test2 = 'bar';

function test(){
    $backtrace = debug_backtrace();
    foreach($backtrace[0]['args'] as &$arg)
        $arg .= 'baz';
}

test(&$test, &$test2);

Однако для этого используется время вызова по ссылке, которое устарело.


Answer #2

Я очень сомневаюсь, что это возможно, но я знаю, как вы можете получить то, что хотите:

function test(&$args) {
    foreach ($args as $arg) {
        $arg .= 'baz';
    }
}

test(array(&$test, &$test2));

Answer #3

Начиная с PHP-5.6 вы можете использовать вариационную ссылку:

function test(&...$args) {
    foreach ($args as &$arg) {
        $arg .= 'baz';
    }
}

Answer #4

Мне также нужна была эта функциональность, я придумал решение.

function sayhello($params) {
    //params hold an unlimited amount of references
}

sayhello([&$one, &$two]);

Это зависит только от php> = 5.4. Если вы используете <= 5.4, используйте синтаксис array () вместо [].

Я люблю [] tho, намного лучше :)


Answer #5

Прекрасно подходит для меня, когда вы делаете что-то вроде приведенного ниже примера. Я думаю, что ключ устанавливает ссылку в foreach.

$var1 = '%DIR%/test';

replaceParameters(
    $var1, 
    $var2, 
    $var3
);

function replaceParameters(&$variables) {

    $variables = array_filter(func_get_args());

    $parameters = [
        '%DIR%' => __DIR__, 
        '%FILE%' => __FILE__,
    ];

    foreach($variables as &$variable) {
        $variable = str_replace(array_keys($parameters), array_values($parameters), $variable);
    }

}

Answer #6
function byref_alias()
{
 //$argz=func_get_args(); //byval, not what you want
 $argz=debug_backtrace()[0]['args']; //byref hack
 $argz[0]++; works
}

Answer #7

Как ответил PHP: список аргументов переменной длины по ссылке? , Нет никакого способа, в PHP для объединения переменной длины и передать аргументы функции ссылки. Вместо этого связанный ответ использует взлом объявления 100 &argx s, а затем используя get_num_args() чтобы выяснить, сколько из них фактически использовалось. Поздравляем, вы нашли особенно трудный угол в PHP;)





pass-by-reference