Bir işleve veri, virgül ayraçlı ifadelerden oluşan bir değiştirge listesi ile aktarılır. Değitirgeler soldan sağa doğru değerlendirilir.
PHP, değiştirgelerin değerleriyle aktarılmalarını (öntanımlı), gönderimli aktarımı ve öntanımlı değiştirge kullanımını destekler. Değiştirge sayısı değişken işlevler de desteklenmektedir.
Örnek 1 - İşlevlere dizi aktarımı
<?php
function dizi_kabul_eder($girdi)
{
echo "$girde[0] + $girdi[1] = ", $girdi[0]+$girdi[1];
}
?>
Öntanımlı olarak, işlev değiştirgeleri değerleriyle aktarılırlar (bu durumda bir değiştirgenin değeri işlev içinde değiştirildiğinde işlevin çağrıldığı yerdeki değeri bundan etkilenmez. İşlevin çağrıldığı yerdeki değerinin de değişmesini istiyorsanız gönderimli değiştirge kullanmalısınız.
Bir işleve bir değiştirgenin daima gönderimli olarak aktarılmasını istiyorsanız, işlev tanımladığınız yerde o değiştirgenin başına & karakterini koyarak bunu sağlayabilirsiniz:
Örnek 2 - Gönderimli işlev değiştirgelerinin aktarımı
<?php
function şunu_da_ekle(&$dizge)
{
$dizge .= 've bir kaç karakter eklenmiştir.';
}
$dzg = 'Bu bir dizgedir ';
şunu_da_ekle($dzg);
echo $dzg; // 'Bu bir dizgedir ve bir kaç karakter eklenmiştir.'
// çıktısını verir.
?>
Bir işlevde, sayıl değiştirgeler için C++ tarzı öntanımlı değerler aşağıdaki biçimde tanımlanabilir:
Örnek 3 - İşlev içinde öntanımlı değiştirge kullanımı
<?php
function kahveyap($hangisi = "orta şekerli")
{
return "Bir fincan $hangisi kahve yapalım.\n";
}
echo kahveyap();
echo makecoffee(null);
echo kahveyap("az şekerli");
?>
Yukarıdaki örneğin çıktısı:
Bir fincan orta şekerli kahve yapalım. Bir fincan kahve yapalım. Bir fincan az şekerli kahve yapalım.
PHP ayrıca, öntanımlı değer olarak dizilerin ve özel NULL
türünün
kullanımına da izin verir, örneğin:
Örnek 4 - Sayıl olmayan türlerin öntanımlı değer olarak kullanımı
<?php
function kahveyap($hangi = array("orta şekerli"), $neyde = NULL)
{
$neyde = is_null($neyde) ? "ocakta" : $neyde;
return "Bir fincan ".join(" bir fincan ", $hangi)." kahve $neyde yapıldı.\n";
}
echo kahveyap();
echo kahveyap(array("çok şekerli", "az şekerli"), "mangalda");
?>
Öntanımlı değer bir değişken, bir sınıf üyesi ya da bir işlev çağrısı değil, bir sabit ifadesi olmalıdır.
Öntanımlı değiştirgeleri kullanırken, öntanımlama yapılmış tüm değiştirgelerin öntanımlama yapılmamış tüm değiştirgelerin sağında yer almasına gerektiğine dikkat edin. Aksi takdirde işler yolunda gitmeyebilir. Aşağıdaki kod parçasını inceleyin:
Örnek 5 - Öntanımlı değiştirgelerin hatalı kullanımı
<?php
function yoğurtyap($nekadar = "az", $neli)
{
return "Bir kase $nekadar $neli yoğurt yap.\n";
}
echo yoğurtyap("çilekli"); // beklendiği gibi çalışmayacaktır
?>
Yukarıdaki örneğin çıktısı:
Warning: Missing argument 2 for yoğurtyap(), called in /home/nilgun/dnm/php-dnm on line 7 and defined in /home/nilgun/dnm/php-dnm on line 2 Bir kase çilekli yoğurt yap.
Şimdi, yukarıdakini bununla karşılaştıralım:
Örnek 6 - Öntanımlı değiştirgelerin doğru kullanımı
<?php
function yoğurtyap($neli, $nekadar= "az")
{
return "Bir kase $nekadar $neli yoğurt yap.\n";
}
echo yoğurtyap("çilekli"); // beklendiği gibi çalışır
?>
Yukarıdaki örneğin çıktısı:
Bir kase az çilekli yoğurt yap.
Bilginize: PHP 5'den itibaren, gönderimli aktarılabilen değiştirgeler öntanımlı değer içerebilmektedir.
Değiştirge sayısı değişken kullanıcı tanımlı işlevler desteklenmektedir. PHP 5.6 ve sonrasında bu ... ile, PHP 5.5 ve öncesinde ise func_num_args(), func_get_arg() ve func_get_args() işlevleri sayesinde bu özelliği kolayca kullanabilirsiniz.
PHP 5.6 ve sonrasında, işlevin değişken sayıda değiştirge içerebilmesini sağlamak için değiştirge listesine ... dizgeciği konulabilir. Değiştirgeler belirtilen değikene bir dizi olarak aktarılır. Örnek:
Örnek 7 Değişkenin değiştirgelerine erişim için ... kullanımı
<?php
function sum(...$numbers) {
$acc = 0;
foreach ($numbers as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
Yukarıdaki örneğin çıktısı:
10
Bir diziyi, bir Traversable değişkeni veya bir sabiti değiştirge listesi haline getirmek için işlev çağrılırken de ... kullanılabilir. Örnek:
Örnek 8 Değiştirgelere erişmek için ... kullanımı
<?php
function add($a, $b) {
return $a + $b;
}
echo add(...[1, 2])."\n";
$a = [1, 2];
echo add(...$a);
?>
Yukarıdaki örneğin çıktısı:
3 3
... dizgeciğinden önce normal konumsal değiştirgeler belirtilebilir. Bu durumda ... ile üretilen diziye sadece bir konumsal değiştirge ile eşleşmeyen tokeni izleyen değiştirgeler eklenir.
... dizgeciğinin önüne bir tür dayatıcı eklemek de mümkündür. Böyle bir durumda, ... tarafından işleme sokulacak tüm değiştirgeler dayatılan sınıfın nesneleri olmalıdır
Örnek 9 Değişken değiştirgelerinde tür dayatma
<?php
function total_intervals($unit, DateInterval ...$intervals) {
$time = 0;
foreach ($intervals as $interval) {
$time += $interval->$unit;
}
return $time;
}
$a = new DateInterval('P1D');
$b = new DateInterval('P2D');
echo total_intervals('d', $a, $b).' gün';
// Bir DateInterval nesnesi olmadığından bu başarısız olur.
echo total_intervals('d', null);
?>
Yukarıdaki örneğin çıktısı:
3 gün Catchable fatal error: Argument 2 passed to total_intervals() must be an instance of DateInterval, null given, called in - on line 14 and defined in - on line 2
Son olarak, ... dizgeciğinin önüne bir & ekleyerek değişken değiştirgelerini gönderimli olarak da aktarabilirsiniz.
Bir işlevin değişken sayıda değiştirge içerebilmesi özel bir sözdizimi gerekmez; ancak işlevin değiştirgelerine erişim için func_num_args(), func_get_arg() ve func_get_args() kullanmak gerekir.
PHP 5.5 ve öncesinde yukarıdaki ilk örnek şöyle gerçeklenirdi;
Örnek 10 PHP 5.5 ve öncesinde değişken değiştirgelerine erişim
<?php
function sum() {
$acc = 0;
foreach (func_get_args() as $n) {
$acc += $n;
}
return $acc;
}
echo sum(1, 2, 3, 4);
?>
Yukarıdaki örneğin çıktısı:
10