Nerede kullanmak zorunda &

3 Cevap java

Birkaç yıl önce ben PHP ile çalışmak için kullanılan ve özellikle OOP kısmında, PHP birçok değişiklik oldum.

Nesne örnekleri ile çalışırken özellikle Geri sonra nesne örnekleri kopyalama önlemek için (cepten sonra çok ilkel idi), çeşitli yerlerde & operatörünü kullanmak zorunda idi.

PHP 5.2 ile orada 4,0 oranla iyileşme bir sürü gibi görünüyor ve ben biraz kafam karıştı.

Ne zaman bir Java programcısı açısından herhangi bir tatsız sürprizlerle önlemek için PHP & operatörünü kullanmak zorunda mı?

Örnekler:

$a = (&)new MyClass();    //Necessary?

function factoryMethod() {
  $a = (&)new MyClass();  //Necessary?
  return (&) $a;          //Necessary?
}

// Other cases?!

EDIT: tesadüfen benim örnekleri tüm & operatörü gerekmez. Ama bunu nerede gerekir?

3 Cevap

Hiçbir yerde örnekler: kısa yapmak için.

Durumda biz objects Eğer her reference operator kullanmak zorunda değilsiniz uğraşıyoruz.

Eğer diğer veri türleri ile ilgili iseniz en sık başvuru işlemleri şunlardır:

Passing by Reference

function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here

Returning References

class foo {
    public $value = 42;

    public function &getValue() {
        return $this->value;
    }
}

$obj = new foo;
$myValue = &$obj->getValue(); // $myValue is a reference to $obj->value, which is 42.
$obj->value = 2;
echo $myValue; // prints the new value of $obj->value, i.e. 2.

Looping with foreach

$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
    $value = $value * 2;
}
// $arr is now array(2, 4, 6, 8)
unset($value); // break the reference with the last element

Kodunuzu kullandığı $value tekrar aşağı eğer son unset()-çağrı önemli olduğu gibi dikkatli olun.

(Referans geçen) ilk vaka çok daha yaygın, ikinci durumda daha, örneğin ise Dizilerle ilgili özellikle:

$array = array(1, 2, 3, 4);
function modifyArray(&$data)
{
    unset($data[1]);
}
modifyArrax($array);
// $array = array(0 => 1, 2 => 3, 3 => 4)

Temelde ihtiyacınız sürece hiç & operatörünü kullanın (ve need bunu denemek değil) yok. Lütfen örneklerin hiçbiri ihtiyacım var.

PHP tüm nesneler başvuruya göre iletilir. Bunu yaparsanız:

$arr = range(1,4);
func($arr);

function func($arr) {
  unset($arr[3]);
}

orijinal diziyi değiştirmez ama bu onu değiştirmek olmaz:

function func(&$arr) {
  unset($arr[3]);
}

ve o olacak. Nesnelerle Oysa:

class A { public $b; }

$a = new A;
$a->b = 3;
func($a);
echo $a->b; // 5

function func($a) {
  $a->b = 5;
}

Her şey üzerine kopyalama-yazma olduğunu.

Yani bazen & operatörünü kullanacak iki haller şunlardır:

  1. Referans olmayan bir nesne geçmek için fonksiyon argümanlar; ve
  2. Diziyi değiştirmek için bir döngü içinde.

(2) 'nin bir örneğidir:

$arr = range(1,4);
foreach ($arr as &$v) {
  $v += 10;
}

& $arr değiştirilemez olmaz olmadan.

PHP 5, sen ve kullanmak gerekmez Sizin örnekte bunları gösterdiğim yerlerden herhangi operatör.