İşlev değiştirgeleri
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 ve İsimli
değiştirgeler de desteklenmektedir.
Örnek 1 - İşlevlere dizi aktarımı
<?php
function dizi_kabul_eder($girdi)
{
echo "$girde[0] + $girdi[1] = ", $girdi[0]+$girdi[1];
}
?>
PHP 8.0.0'dan itibaren, işlev değiştirgelerinin sonunda göz ardı edilecek
bir virgül bulunabilir. Bu, özellikle değiştirge listesinin uzun olduğu
veya uzun isimler içerdiği durumlarda, değiştirgeleri alt alta sıralamayı
kolaylaştırır.
Örnek 2 - Virgül ile sonlanan işlev değiştirgeleri örneği
<?php
function takes_many_args(
$first_arg,
$second_arg,
$a_very_long_argument_name,
$arg_with_default = 5,
$again = 'a default string', // 8.0.0 öncesinde bu virgüle izin verilmezdi.
)
{
// ...
}
?>
PHP 8.0.0'dan itibaren, zorunlu değiştirgelerin seçimlik değiştirgelerden
sonra aktarımı kullanımdan kaldırılmıştır. Bu sorun genellikle öntanımlı
değeri yazmamak suretiyle çözümlenebilir. Bunun tek istisnası null
öntanımlamasının türü örtük olarak nullable yapan Type $param =
null
şeklindeki değiştirgelerdir. Bu kullanımda kalmışsa da örtük
bir nullable türü kullanılacaksa önerilir.
Örnek 3 - Zorunlu değiştirgelerin seçimliklerden sonra kullanımı
<?php
function foo($a = [], $b) {} // Önce
function foo($a, $b) {} // Sonra
function bar(A $a = null, $b) {} // Hala kullanımda
function bar(?A $a, $b) {} // Önerilen
?>
Gönderimli değiştirge kullanımı
Ö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 4 - 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.
?>
Başvuruyla iletilmesi beklenen bir değeri değiştirge olarak iletmek
bir hatadır.
Öntanımlı değiştirge değerleri
Bir işlevde, sayıl değiştirgeler için C++ tarzı öntanımlı değerler
aşağıdaki biçimde tanımlanabilir:
Örnek 5 - İş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 6 - 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 7 - Ö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 8 - Ö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:
Gönderimli aktarılabilen değiştirgeler öntanımlı değer içerebilir.
Değişken uzunlukta değiştirge listesi
PHP, kullanıcı tanımlı işlevlerde değiştirge listesinin sonuna
...
konarak listenin uzatılmasını destekler.
Bilginize:
Değişken uzunlukta değiştirge listesi
func_num_args(),
func_get_arg() ve
func_get_args() işlevleri kullanılarak da elde
edilebilir. Bu teknik ...
kullanımından öncesine ait
olduğundan kullanımı önerilmez.
Değiştirge listeleri, işlevin değişken sayıda değiştirge kabul ettiğini
belirtmek için ...
simgesini içerebilir. Bu durumda
değiştirgeler değişkene bir dizi olarak aktarılır. Örneğin:
Örnek 9 - Değişken uzunlukta değiştirgeler için ...
kullanımı
<?php
<?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ı:
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 10 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ı:
...
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.
Örnek 11 Değişken değiştirgelerinde tür bildirimi
<?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.
Daha eski PHP sürümlerinde
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.
Eski PHP sürümlerinde yukarıdaki ilk örnek şöyle gerçeklenirdi;
Örnek 12 Eski PHP sürümlerinde 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ı:
İsimli değiştirgeler
PHP 8.0.0, var olan konumsal değitirgelerin bir uzantısı olarak isimli
değiştirgeleri tanıttı. İsimli değiştirgeler, değiştirgelerin konuma göre
değil değiştirge adına göre işleve iletilmesine izin verir. Bu,
değiştirgenin anlamını kendi kendine belgelendirir, değiştirgeleri
sıralamadan bağımsız hale getirir ve öntanımlı değerlerin keyfi olarak
atlanmasına izin verir.
İsimli değiştirgeler, değerin önüne iki nokta üst üste ile değiştirge adı
eklenerek iletilir. Ayrılmış anahtar sözcüklerin değiştirge adları olarak
kullanılmasına izin verilir. Değiştirge adı bir tanımlayıcı olmalıdır,
bir değişkenle belirtilmesine izin verilmez.
Örnek 13 - İsimli değiştirge sözdizimi
<?php
işlevim(değiştirgeAdı: $değer);
array_foobar(array: $değer);
// desteklenmiyor
işlev_adı($değişkeneSaklanmışDeğiştirgeAdı: $$değer);
?>
Örnek 14 - Konumsal ve isimli değiştirgeler
<?php
// Konumsal değiştirgeler:
array_fill(0, 100, 50);
// İsimli değiştirgeler:
array_fill(start_index: 0, count: 100, value: 50);
?>
İsimli değiştirgelerin aktarılma sırasının bir önemi yoktur.
Örnek 15 - Farklı değiştirge sırasıyla yukarıdaki örnek
<?php
array_fill(value: 50, count: 100, start_index: 0);
?>
İsimli değiştirgeler konumsal değiştirgelerle birleştirilebilir. Bu
durumda, isimli değiştirgeler konumsal değiştirgelerden sonra gelmelidir.
Sıralarına bakılmaksızın, bir işlevin isteğe bağlı değiştirgelerinden
yalnızca bazılarını belirtmek de mümkündür.
Örnek 16 - İsimli değiştirgelerle konumsal değiştirgeleri birleştirmek
<?php
htmlspecialchars($string, double_encode: false);
// Same as
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
?>
Aynı değiştirgeyi birden fazla kullanmak bir Error istisnasına yol açar.
Örnek 17 - Aynı değiştirgeyi birden fazla kullanırken Error istisnası
<?php
function foo($param) { ... }
foo(param: 1, param: 2);
// Hata: $param isimli değiştirgesi önceki değiştirgeyi geçersiz kılıyor
foo(1, param: 2);
// $param isimli değiştirgesi önceki değiştirgeyi geçersiz kılıyor
?>