PHP Çağrı Süresi Geçiş Başvuru

4 Cevap php

Çağrı Süresi Geçiş Başvuru nedir? Ne yapar?

4 Cevap

Ben Call Zaman Geçiş By Referans demek varsayıyorum.

PHP, & operatörü (üzerinde stackoverflow bu konuda birçok bilgi var) reference değişken alacak

Eğer bir referans almaz bir işleve argüman olarak bir başvuru geçirmek nerede pass by reference olduğu zaman Çağrı

function foo($myParam){
}

//Call Time Pass By Reference
foo(&$myArg);

O kadar onaylanmaz ve değer geçirilecek olacak gibi bu PHP 5.3 bir uyarı verecektir. Bunu yapmak için doğru yolu bir başvuru almak için function foo değiştirmek için

function foo(&$myParam){
}

foo($myArg); //myArg is passed by reference

Referans ile çağrı zaman geçmesine preform yeteneği ini ayarıyla denetlenir

allow_call_time_pass_reference

Daha yeni sürümleri bu varsayılan olarak kapalıdır.

Neden kötü nedeni fonksiyonu (ve okuyucu) parametreleri başvuruları hangi bilmek ve değil hangi olmasıdır. Bu çok zor takip kodu yapar.

Bana çağrı süresi başvuru kullanabilirsiniz izin vermeden sorun PHP'nin yerleşik fonksiyonların beyanı değiştiremezsiniz olduğunu ben fonksiyonları inşa üzerinde çağrı süresi referanslar bir sürü kullandım, ben bu işlevler ne tam olarak ne olduğunu ve Hiçbir mischiefs olacağını biliyorum, ben özelliği kullanmak gerekir ve o zaman ben, örneğin, belirli durumlarda ihtiyaç, bu referans kabul edilmesi gerekmez yanında ben, bu işlevini yeniden yapamazsınız:

$rows[] = array_map('array_shift', &$data);

yerine foreach ifadesi yapıyor, ben geri arama gibi bir array_map ile ve dizi vardiya yaparak zaman ve kodlama satırları kaydedebilirsiniz, sorun (ben bilmiyorum eğer onun bir hata) o {[(1) }] (Ben onun referans şey bir referans değerini alırsanız sadece 1 düzeyi için çalışıyor ve referansını kaybeder referans almaz başka bir fonksiyonu üzerine atar, çünkü keşke php sanırım referans benim diziyi almaz ) gerçek işaretçileri değil, bu referans şey vardı bu nedenle ben çağrı anda referans dizi geçmesi gerekiyor.

Başka bir örnek

new ArrayObject(&$_POST, ArrayObject::ARRAY_AS_PROPS)

I my $_POST bir dizi nesne olarak istiyorum, ama bir şey unset eğer ben o gerçek $_POST üzerinde gerçekleşmesi ve bu yüzden {$_SESSION ile yapabileceği ve istiyorum [(3)], ben referans dizi var benim kendi nesne oluşturmak zorunda}, ben bu durumda ne yapıyorum biliyor ve kötü bir uygulama ise yerine yapıyor, onunla sorun göremiyorum Bu biraz zaman kaybettik ....

Nokta ilk etapta işaretçileri almak için tasarlanmış değildi fonksiyon işaretçileri geçmesine izin verir orada herhangi bir dil olduğunu, belki de kötü bir uygulama ama o, o karar bana değil mi?

Bu özellik, kullanım dışı olmamalıdır.

The PHP manual açıklıyor:

Günümüzde, referanslar böyle işlev bildirimi ile beyan edilir:

function foo (&$bar) {
  // changing $bar changes the original variable
}

Ancak, sözdizimi da işlevini çağırmak referans, bir değişken geçirmeden sağlar:

foo(&$bar);

kötü stil ve hata eğilimli olarak kabul edilir beri ve that, önerilmemektedir. (Bir işlev bilmiyorsa, bir kopya ya da orijinal değişkenin üzerinde hareket ediyorsa, sen oluyor herhangi bir yaramazlık düşünebilirsiniz.)

Referans işlevi çağrısı anda geçmiş olduğundan ikinci bir, call time pass by reference denir. (Hm. .. totoloji kulübün ilk kuralı totoloji kulübün ilk kuraldır.)

Bir fonksiyona değer geçerken PHP o kadar değer bozulmamış bir işlevin dışında kullanmak fonksiyonu için kopyalanır. Bu değer geçen denir. Eğer işlev içinde değerini değiştirmek isterseniz (değer kendisi, bir değere bir işaretçi pass) referans bir geçiş yapacak. Ben bu & karakter kullanılarak yapılır PHP.

$a = 1;

function b($a) {
    $a + 1;
    echo $a;
}

echo $a; // print 1
echo b($a); // print 2
echo $a; // $a is still 1
echo b(& $a); // print 2
echo $a; // $a is now 2

Eğer bir başvuru geçirmek istiyorsanız iki PHP yapmanın yollarını ve bunun birini (call-time) önerilmiyor var.

Referans olarak geçmek Zamanlar Çağrı:

b(& $a);

Bunun yerine ne yapmalıyım işlev bildirimini değiştirmek ve & var ekleyin.

// declare reference parameter
function b(& $a) {
    ...
}

b($a); // pass by reference