Pass-by-reference önerilmiyor hatası PHP çağrı süresini önlemek için?

5 Cevap

I reduce the warnings Benim apache server günlüğüne gönderilen olduğunu çalışıyorum.

Bir uyarı:

Çağrı-time pass-by-reference onaylanmaz.

Böyle yararlı bir programlama özelliği olduğu o hard for me to imagine neden bu önerilmemektedir idi, temelde ben bunu:

public function takeScriptsWithMarker(&$lines, $marker) {

    ...
}

ve ben bu fonksiyon tekrar tekrar ondan geri sonuçları almak ve bunları işleme, aynı zamanda array $ satırları tekrar tekrar bu yönteme gönderilen tarafından inşa izin diyoruz.

  1. Bu kapsamlı olacağını yeniden programlamak.
  2. Ben diğer uyarıları görmek istiyorum çünkü sadece "uyarıları kapatmak" istemiyorum.

Önerilmemektedir Call-by-referans gibi Yani, what is the "accepted way" to attain the functionality bu desen: yani bir yönteme dizelerden oluşan bir dizi göndererek, onları o diziyi kullanmaya devam, yöntemi ile değiştirilebilir mi?

5 Cevap

Aslında, işlevi tanımlamak şekilde hiçbir sorun yok. Eğer işlevini çağırmak yolu ile bir sorundur. Yani, örneğin, yerine çağıran like it:

takeScriptsWithMarker(&$lines, $marker);

Sen gibi derim:

takeScriptsWithMarker($lines, $marker); // no ampersands :)

Yani özellik hala mevcuttur. Ama bu değişimin arkasında nedenini bilmiyorum.

Bir önceki cevapta, yukarıda belirtildiği gibi, konu .. ÇAĞRI zaman değil, tanım süre sonunda böylece bir işlevi olarak tanımlayabiliriz:

function foo(&$var1,$var2,$var3=null){
    // procesing here
}

: o kadar çağrı

$return = foo($invar1,$invar2);

İlk invar referans olarak geçirilir, ikinci bir değildir.

Bunu gibi çağırmak çalıştığınızda hata görüntülenir:

$return = foo(&$invar1,$invar2);

Sen allow_call_time_pass_reference true sizin php.ini dosyasında ayarlayabilirsiniz. Ama kesmek.

Sen bir başvuru ile bir dizi geçebileceği:

public function takeScriptsWithMarker(array(&$lines, $marker))

diğer ucunda üstlenmeden bir miktar dikkate almalıdır edilmektedir.

Sen, dizideki geçmek onu işlemek izin ve sonra yerine orijinal referans ile uğraşmaktansa, bunu "geri" olabilir. Bu sadece bir dönüş ve atama dahil etmek çok zor olmamalı.

public function takeScriptsWithMarker($lines, $marker) {
    //...
    return $lines;
}

Kullanımı:

$lines = takeScriptsWithMarker($lines, $marker);