Şekilde belirsizlik "referans" var mı

0 Cevap php

Örneğin, PHP biz böyle bir şey yazabilirsiniz:

class C {
    var $x;

    function __construct($x) {
        $this->x = $x;
    }

    function __toString() {
        return (string)$this->x;
    }
}

function f1($obj) {
    $obj->x = 2;
}

$a = new C(1);
f1($a);
echo $a; // 2

Ve bazı bu onların özelliklerini değiştirebilirsiniz, çünkü nesneler başvuruya göre iletilir gösterir ve bu değişiklikler sınıfının dışında yansıtılır söyleyebilirim. yani nesne ilkellerdir şekilde kopyalanmaz.

Ama sonra bu yazabiliriz:

function f2($obj) {
    $obj = new C(2);
}


$b = new C(1);
f2($b);
echo $b; // 1

Hangi şimdi nesne bütün referans olarak geçmedi göstermektedir. Gerçekte, nesne kopyalanan (yani, değer geçirilir) değil deep-kopyalanan; $obj kopyalandığı, ancak $x hala aynı şeyi ifade eder.

Ben sözcüğü hem yollarını anlatmak için kullanılan "referans" duydum; Bazı PHP referans geçmek olduğunu söyleyebilirim, diğerleri değerine göre geçiş söyleyebilirim.

Biz PHP referans geçmek olduğunu söylemek ise, o zaman gibi bir işlevi tanımlamak derken ne demek istedin

function f3(&$obj)

? That function, bir nesneye bir başvurusu bir sürer, bu ilk anlamı yanlış olduğunu göstermektedir.

Ama sonra ne C # C + + gibi dillerin ve yapılar hakkında? Benim C + + biraz paslı, ama bu işlevleri işaretçileri mümkünse başvuruları almak, ya da kullanım yapmak için teşvik ediyor neden olan, çevresinde geçirdiğinizde bütün sınıf aslında derin-kopyalanan alır inanıyorum. C # da geçmiş olsun nasıl yapılar ve sınıflar arasında bir fark var.

Değeriyle geçemezse eğer, bu derin kopyalama davranışı ne diyorsunuz?

Biz bunları açıklamak için 3 davranışları ve sadece iki sözcük var gibi görünüyor, ve bu toplumda karışıklık bir çok yaratıyor.

Sizden biriniz ben burada yanlış bir şey yazdı söyle için Heck, ben sadece bekliyorum.


Özet olarak, 3 davranışlar:

  1. Nesneler (nesne ve özellikleri klonlanmış) derin kopyalanır
  2. Sadece nesne (özellikleri hala bellek aynı öbek bakınız) kopyalanır
  3. Nesne hiç kopyalanmaz

Teknik olarak, bu davranışların her biri ne demeliyim? pass-by-??

0 Cevap