PHP: referans olarak geçirilen değişkenler alternatif?

3 Cevap

Dakika php6 developer meeting, i arama-time-pass-by-reference PHP6 var artık olduğunu söyledi bir noktaya geldi. Örneğin, her iki PHP6 için yanlış şunlar:

<?php
$foo =& new StdClass();
?>

<?php
function &foo()
{
    return new StdClass();
}

$f = foo();
?>

Biz PHP6 böyle bir şey kullanabilirsiniz yapamıyorsanız:

$foo =& new StdClass();

Buna alternatif nedir, bu taklit için herhangi bir yolu var mı?

EDIT:

Ans PHP6 değişkenler ile ilgili, biz değişkenler için, örneğin bu ne yapabilirim:

$this->data =& $_SESSION;

3 Cevap

Sen referansla değil pass parametreleri, ama yine de / referans receiving parametre olarak işlev / yöntem bildirmek zorundadır edebilirsiniz.

yani, bunu (passing parameters by reference) yok:

my_function(& $my_var);

function my_function($a) {
    // ...
}

Ama bunu yapabilirsin (declaring the function as receiving parameters by reference):

my_function($my_var);

function my_function(& $a) {
    // ...
}


And... The code examples you gave are not related to call-time-pass-by-reference, but are related to return-by-reference.

Bu ikinci şey, ne sadece kaldırırsanız &? Işlev içinde oluşturulmuş oldu nesnesinin örneği iade edilecektir, ve sen hala olmaz, onunla çalışmak mümkün olacak?

Nesneler hep PHP5'ta beri referans geçti, yani bu vardır:

$foo =& new StdClass();

: aynı gibidir

$foo = new StdClass();

.

Ans what about variables in PHP6, can we do that for variables eg: $this->data =& $_SESSION;

Onlar çok yararlı olduğu gibi, PHP başvuruları kaldırarak olmayacak - Ben neden hiçbir neden görmüyorum. Bir değişkene bir başvuru oluşturmak için başka bir yolu yoktur.

Çağrı-time pass-by-reference bir süre kalmıştır. Sadece demek yerine bunu yapmanın:

function foo($a) { return ++$a; }
foo(&$my_a);

Bunu yapardı:

function foo(&$a) { return ++$a; }
foo($my_a);

Bu çok daha temiz ve daha kolay anlaşılır programlama tarzı yol açar ve bu da beklediğiniz zaman değişkenler her zaman başvurulan olmasını sağlar, ve zaman yok.

Nesneler ile ilgili bir özel durum - onlar her zaman başvuruya göre iletilir ve geçiş-değer tarafından simüle etmek için tek yolu kullanmaktır olan clone:

$a = new StdClass();
$a->foo = 'bar';
$b = $a;
$a->foo = 'qux';
// $b->foo is 'qux' too

$a = new StdClass();
$a->foo = 'bar';
$b = clone $a;
$a->foo = 'qux';
// $a->foo is 'qux' but $b->foo is 'bar'

Umarım ki olur!