Değer veya referans yoluyla geçirilen PHP nesneler nelerdir?

3 Cevap php

Bu kodu:

<?php
class Foo
{
    var $value;

    function foo($value)
    {
        $this->setValue($value);
    }

    function setValue($value)
    {
        $this->value=$value;
    }
}

class Bar
{
    var $foos=array();

    function Bar()
    {
        for ($x=1; $x<=10; $x++)
        {
            $this->foos[$x]=new Foo("Foo # $x");
        }
    }

    function getFoo($index)
    {
        return $this->foos[$index];
    }

    function test()
    {
        $testFoo=$this->getFoo(5);
        $testFoo->setValue("My value has now changed");
    }
}
?>

Yöntemi Bar::test() çalıştırılır ve foo nesnelerin dizi foo # 5 değerini değiştirdiğinde, gerçek foo dizideki 5. etkilenecek, ya da olacak $testFoo değişken fonksiyonunun sonunda ortadan kalkıncaya olur sadece yerel bir değişken olabilir mi?

3 Cevap

Neden işlevi çalıştırmak ve bulmak değil mi?

$b = new Bar;
echo $b->getFoo(5)->value;
$b->test();
echo $b->getFoo(5)->value;

Benim için (kod ile birlikte) Yukarıdaki kod bu çıktıyı üretilen:

Foo #5
My value has now changed

Bu ancak, "başvurusu atama" nedeniyle, "referans olarak geçen" nedeniyle değil. PHP referans 5 atama nesnelerle varsayılan davranıştır. Yerine değerine göre atamak isterseniz, clone anahtar kelime kullanın.

Onlar PHP 4 ve PHP 5 içinde referans olarak değer geçirilir PHP 4 referans nesneleri geçmek için açıkça gibi onları işaretlemek zorunda.:

$obj = &new MyObj;

Siz sorunuzun asıl cevabı için http://ca2.php.net/manual/en/language.oop5.references.php başvurabilirsiniz.

Sık sık söz edilir PHP5 OOP kilit noktalarından biri "nesneler varsayılan olarak referanslar tarafından geçirilen" olmasıdır. Bu tamamen doğru değildir.

Bir PHP referansı iki farklı değişken aynı değeri yazmak için izin veren bir diğer addır. PHP5'ta itibariyle bir amacı değişken artık değer olarak nesnenin kendisini içermemektedir. Sadece nesne erişimcileri gerçek nesneyi bulmak için izin veren bir nesne tanımlayıcısı içerir. Bir nesne, argüman tarafından gönderilen iade veya başka bir değişkene atandığında, farklı değişkenler takma ad değil: Onlar aynı nesneye işaret tanımlayıcı, bir kopyasını tutun.