2010-01-22 15 views
10

PHP'de, değişken bir parametre miktarını tanımlamanıza olanak veren bir işlev tanımlamanın bir yolu var mı? Onunla daha aşinayım dildePHP: Değişken parametre sayısıyla fonksiyonu tanımlayın?

yüzden gibidir:

function myFunction(...rest){ /* rest == array of params */ return rest.length; } 

myFunction("foo","bar"); // returns 2; 

teşekkürler!

cevap

32

Evet. variadic functions Şimdi kullanabileceğiniz 5.6+ PHP

<?php 
    function dynamic_args() { 
     echo "Number of arguments: " . func_num_args() . "<br />"; 
     for($i = 0 ; $i < func_num_args(); $i++) { 
      echo "Argument $i = " . func_get_arg($i) . "<br />"; 
     } 
    } 

    dynamic_args("a", "b", "c", "d", "e"); 
?> 

:

<?php 
    function dynamic_args(...$args) { 
     echo "Number of arguments: " . count($args) . "<br />"; 
     foreach ($args as $arg) { 
      echo $arg . "<br />"; 
     } 
    } 

    dynamic_args("a", "b", "c", "d", "e"); 
?> 
Ben, senin fonksiyonu içine bir dizi geçirilecek bu şekilde teşvik edecek
+2

oldukça emin 'func_get_args () Bu aslında bu ilk çözüm yerine kullanmak istediğiniz şeydir. – Toskan

0

sahip olabilir argümanları almak için func_num_args() ve func_get_arg() kullanın Bu dizide saklanan birçok farklı parametre. İhtiyacınız olan doğru bilgiyi almak için fonksiyonda olduğunda dizide yapabileceğiniz birçok işlem vardır.

$array = array(); 
$array[0] = "a"; 
$array[1] = 1; 

myFunction($array); 
6

Çok boyu beyan argümanları doldurmak için yeterli olduğu gibi, herhangi bir işleve bağımsız değişken bir dizi kabul edebilir.

<?php 

function test ($a, $b) { } 

test(3); // error 
test(4, 5); // ok 
test(6,7,8,9) // ok 

?> 

sen işlevleri func_get_args(), func_num_args() ve func_get_arg($i) kullanın test() geçirilen ekstra un-adlandırılmış argümanlar erişmek için:

benim PHP parametrelerle bir JavaScript-vari bir yaklaşım ister
<?php 

// Requires at least one param, $arg1 
function test($arg1) { 

    // func_get_args() returns all arguments passed, in order. 
    $args = func_get_args(); 

    // func_num_args() returns the number of arguments 
    assert(count($args) == func_num_args()); 

    // func_get_arg($n) returns the n'th argument, and the arguments returned by 
    // these functions always include those named explicitly, $arg1 in this case 
    assert(func_get_arg(0) == $arg1); 

    echo func_num_args(), "\n"; 
    echo implode(" & ", $args), "\n"; 

} 

test(1,2,3); // echo "1 & 2 & 3" 

?> 
1

. Bu, "seçeneklerin" ve onların varsayılan değerlerinin daha iyi ayarlanmasına olanak tanır (ki buna anlık olarak bakacağım). Örneğin, bir dizide belirli aralıklarla dönen bir işleviniz olduğunu varsayalım. Parametre 1 başlangıç ​​zamanı, parametre 2 bitiş zamanı, parametre 3 zaman aralığı ve isteğe bağlı olarak herhangi bir seçenek ("format" => "24-hour", "include_seconds" => TRUE gibi)).

böyle fonksiyonu tanımlarsınız:

function returnTimeInterval($startTime, $endTime, $interval, $options = array()) 
{ 
    // the first thing to do is merge options in with our defaults 
    $options = array_merge(array(
     "format" => "24-hour", 
     "include_seconds => TRUE 
     // etc. 
    ), $options); 

Bu oldukça serin sonra geçersiz kılınabilir fonksiyonu içerisinde varsayılan ayarı için izin verir. Elbette, garip, kullanılmayan seçeneklerin geçmediğine dikkat etmelisiniz, ama bunu size bırakacağım. :)

+0

'array_intersect_key()' bilinmeyen seçeneklerden kaçınmanıza yardımcı olur. – Walf

2

ya da sadece

function printArgs() { 

foreach (func_get_args() as $arg){ 
    echo $arg; 
} 
} 

printArgs("1 ", "2 ", "three "); 

çıkışları

2

bu soru çok eski olmasına rağmen 1 2 three: Aslında PHP'de tam olarak ne yazdın yazabilir 5.6+: D

İlgili konular