PHP: değişken parametre sayısı ile fonksiyon tanımlanır?

4 Cevap php

Eğer parametrelerin değişken miktarda tanımlamak sağlar PHP bir işlev tanımlamak için bir yolu var mı?

dilde ben bu kadar gibi daha tanıdık:

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

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

Teşekkürler!

4 Cevap

Evet. func_num_args() kullanın ve func_get_arg() argümanları almak için:

<?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 5.6 + artık kullanabilirsiniz variadic functions:

<?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");
?>

O kadar uzun bütün argümanlarını beyan doldurmak için yeterli olduğu gibi, herhangi bir fonksiyon için bağımsız değişken bir sayı kabul edebilirsiniz.

<?php

function test ($a, $b) { }

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

?>

Geçirilen ekstra un adlandırılmış değişkenleri erişmek için test(), sen işlevleri func_get_args(), func_num_args() kullanın ve func_get_arg($i):

<?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"

?>

Ben PHP parametreleri ile bir JavaScript-vari bir yaklaşım almak istiyorum. Bu (Ben de bir an bakacağım) "seçenekleri" ve varsayılan daha iyi ayarı sağlar. Örneğin, bir dizi kez bir dizi döndüren bir işlevi var diyelim. Parametre 1 Parametre 2 Parametre 3 zaman aralığı olan, bitiş zamanı, ve bundan sonra herhangi bir seçenek vb "format" => "24 saat", "include_seconds" => TRUE gibi (isteğe bağlı, başlangıç ​​zamanı .)

Bu gibi işlevi 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 kılınabilir işlevi, içindeki varsayılan ayarı sağlar. Tabii ki, garip, un-kullanılan seçenekler geçirilen olmadığını bakmak gerekir, ama ben bunu sana bırakacağım. :)

Ben, senin fonksiyon içine bu dizide saklanan gibi birçok farklı parametrelere sahip olabilir bu şekilde bir dizi geçmek için teşvik edecek. Ihtiyacınız doğru bilgi almak için işlevi olduğunu bir kez dizide yapabilirsiniz birçok operasyonu vardır.

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

myFunction($array);