Pass-by-reference ne zaman PHP

5 Cevap php

Onun iyi uygulama sadece bir değişken okurken by-başvuru-pass, ya da her zaman bir değer olarak kabul edilmelidir if Im merak.

Pass-by-reference ile Örnek:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function &do_my_hash(&$value){
   return md5($value);
}

Pass-by-value ile Örnek:

$a = 'fish and chips';
$b = do_my_hash($a);
echo $b;

function do_my_hash($value){
   return md5($value);
}

Hangisi daha iyi? Örneğin ben 1000 mermi ile bir döngü çalıştırmak olsaydı?

Döngünün Örnek:

for($i = 0 ; $i < 1000 ; $i++){
   $a = 'Fish & Chips '.$i;
   echo do_my_hash($a);
}

5 Cevap

Eğer geçmek demek durumunda bir value (so the function doesn't modify it), referans olarak geçmek için hiçbir neden yoktur: insanlar düşünmek gibi sadece ([{", anlamak için kod zor hale getirecek 2 )]} "


In the example you provided, your do_my_hash function doesn't modify the "value" you're passing to it ; so, I wouldn't use a reference.


And if you're thinking about performances, you should read this recent blog-post : Do not use PHP references (quoting) :

Another reason people use reference is since they think it makes the code faster. But this is wrong. It is even worse: References mostly make the code slower!
Yes, references often make the code slower - Sorry, I just had to repeat this to make it clear.

Aslında, bu makalede performansları sonra gitmiyorsun bile, ilginç bir okuma olabilir ;-)

İyi programlama uygulama zaman yapabilirsiniz değere geçmek için her zaman ve tek bir değerini değiştirmek zorunda eğer bir fonksiyonun bir sonucu olarak değiştirilmiş değeri döndürmek yerine referans değerini geçmesi için genellikle daha bulunuyor.

Birden değerlerini değiştirmek gerekir nereye başvuru geçmek gerekebilir tek olgu olduğunu. Ancak bu gibi durumlarda sorunu yaklaşan daha iyi bir yolu muhtemelen var çünkü nadirdir ve genellikle size kodunu kontrol etmek için bir bayrak olarak tedavi edilmelidir olma eğilimindedir.

Geri gün içinde her zaman referans ve değer geçirerek geçmek için kullanılan erken programlama dilleri çünkü er ya da geç bir programcı değiştirmek için kod koyar geçti bu (karanlık hata ile sona eğilimi ürettiği sorunları çözmek için daha sonraki bir gelişme oldu bazı işlev veya diğer referans değer ile ve daha sonra nerede ve düzgün düzeltmek tanımlamak için zor bulunuyor - Birden, karanlık, bağımlılıkları ile sona eğilimindedir). Dolayısıyla gerçekten ciddiye sürdürülebilir, temiz, yardım için karmaşıklık vs cpu iyi bir trade-off kabul edildi biz noktasının ötesine işlemcinin birden nesiller olduğunuzda bir kaç makine döngüleri Tıraş için bir seçenek olarak göz önünde oldukça sapık var, kodu.

, PHP ve copy-on-write (genellikle performansı artıracak zaman) böylece başvurular kullanarak herhangi bir performans parası vermek gitmiyor mümkün olduğunca fazla faydalanmak yapar sadece zarar verir. Gerçekten onları yalnızca ihtiyacınız olduğunda başvuruları kullanın. PHP Manual:

not performansını arttırmak için geri dönüşü-by-başvuru kullanıyor musunuz. Motor otomatik olarak kendi kendine bu duruma getirecektir. Bunu yapmak için geçerli bir teknik sebebi var sadece başvuruları dönmek.

Mikro-optimizasyon sevinç. :-)

Dürüst olmak gerekirse, (muhtemelen kendi özgün kapsamında, kendi değerini etkilenmesini istemiyorsanız) referans olarak 'normal' değişkenleri geçirerek elde edilecek büyük bir anlaşma değil. Ayrıca, PHP yana 5 nesneler otomatik olarak başvuruya göre iletilir.

Eğer işlev içinde bu değeri değiştirmek istemiyorsanız referans geçirerek hiçbir yararı daha vardır. Ben pass-by-value mümkün olduğunca, okumak için çok daha kolay olarak kullanmayı deneyin, ve script akışı daha tutarlıdır.