Pass-by-Referans Hata

3 Cevap php

Ben localhost çalışan bir kanca sistemi kurulumunu ... var ... Ben canlı koyun ve söyleyerek bir hata alıyorum "Uyarı: Çağrı-time pass-by-reference onaylanmaz".

Şimdi, görünüşe etrafında çalışma tümünü kaldırmak için "&" işlev çağrıları, yani foo (& $ me) foo ($ me) ve daha sonra foo fonksiyonu tanımı "function foo (& $ me)" yapmak.

Ancak, ben bunu yapamam ... benim kanca argüman olarak bir dizi kabul, çünkü ben bunun için etrafında bir çalışma gerekiyor. Sanki "run_hooks ('çengel-name', $ me);" kullanabilirsiniz veya "run_hooks ('çengel-name', array ($ me $ another_var, vs ..))";

Bu yüzden bu geçemeyeceği söyleyerek php bir hata alırsınız, çünkü ben referans olarak "(dizi)" "fonksiyonu run_hooks ($ hook_name, & $ argümanlar)" kullanmak anlamına gelir ...

Herhangi bir fikir, bir etrafında bir iş?

Teşekkürler.

3 Cevap

I guess veri gereksiz kopyalarını engellemek amacıyla bir başvuru kullanmak istiyorum. Ama bu (PHP5) için bunları kullanmak ne değildir. Sadece dizi geçirmek.

function foo($x /* not a reference */) {
  echo $x['bar'], "\n";
} 
$p = array('bar'=>12345);
foo($p);
// or
foo( array('bar'=>12345) );

Bu parametre olarak geçirilen dizinin hiçbir derin bir kopyasını çağırır - sürece dizisini değiştirmek yok gibi. Bu mekanizma, copy-on-write denir ve php uygulama http://www.research.ibm.com/trl/people/mich/pub/200901_popl2009phpsem.pdf açıklanmıştır

Etrafında referansların bir dizi iletin - Bu dizinin kendisi bir referans olması gerekmez:

 function foo($args) {
    modify $args[0]...
    modify $args[1]...
 }

 $someVar = ...
 $anotherVar = ...

 foo(array(&$someVar, &$anotherVar));

Başka kimseye yardımcı olabilir ... Ben uygulanabilir bir çözüm, herhangi bir hata buldum, ve bu benim sınıflarında hiçbir şey değiştirmeden çalışır ... DiziNesnesi nesneler seince, bunu çözmüş zaten 'başvurulan' vardır.

function test ( $var, $foo )
{
    $var    = 3;
    $foo    = 3;
}

$var    = 1;
$foo    = 1;
call_user_func_array ( 'test', new ArrayObject ( array ( &$var, &$foo ) ) );

print $foo;
print $var;

// Output is 3 3 like expected :)