PHP: referans değişken uzunlukta argüman listesi?

4 Cevap php

Bu referansla parametrelerin hepsi bir değişken sayı alır bir PHP işlevi oluşturmak mümkün mü?

It doesn't help me a function that receives by reference an array of values nor a function that takes its arguments wrapped in an object because I'm working on function composition and argument binding. Don't think about call-time pass-by-reference either. That thing shouldn't even exist.

4 Cevap

PHP has no buildin function for variable parameters by reference. But object are always passed by reference. (Since php5 that is)

Ancak olası için:

function foo(&$param0 = null, &$param1 = null, ... , &$param100 = null) {
  $argc = func_num_args();
  for ($i = 0; $i < $argc; $i++) {
    $name = 'param'.$i;
    $params[] = & $$name;
  }
  // do something
}

The "..." is not php syntax, you'll have to type them in. So you'll always have a maximum amount of parameters. but with the func_num_args() you could detect if more are needed.

Bir işleve fazla 7 parametreleri geçirerek zaten kötü bir uygulamadır ;)

Düzenleme: Ben onları referansları olmak istedim görmedim üzgünüm .... yapmanız gereken bir nesne olarak onları geçmek olduğunu.

Ayrıca, örneğin onları bir diziye iletebilirsiniz

myfunction(array('var1' => 'value1', 'var2' => 'value2'));

sonra fonksiyonu sadece

myfunction ($arguments) {

echo $arguments['var1'];
echo $arguments['var2'];

}

Diziler de iç içe olabilir.

Bir nesneye sarılmış tüm parametreleri geçmek gerekir.


Class A
{
    public $var = 1;
}

function f($a)
{
    $a->var = 2;
}

$o = new A;
printf("\$o->var: %s\n", $o->var);
f($o);
printf("\$o->var: %s\n", $o->var);

should print 1 2

Bu mümkündür:

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

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

test(&$test, &$test2);

Ancak, bu itiraz edildi referansla çağrı zaman geçmesine kullanır.