Php By Referans

5 Cevap php

Birisi ne "ve" lütfen açıklayabilir Aşağıdaki yapar:

class TEST {

}

$abc =& new TEST();

Ben referans olduğunu biliyorum. Neden ve ne zaman böyle bir şey gerekir ama birileri göstermek olabilir? Ya da bu iyi açıklanmıştır bir url bana gelin. Ben kavramı kavrayamayan duyuyorum.

Çok teşekkür ederim.

5 Cevap

Anladığım kadarıyla, genel olarak PHP başvurular hakkında soran, ama değil $foo =& new Bar(); inşaat dille ilgili.

Bu yalnızca $foo = new Bar() a copy nesnenin depolayan her zamanki gibi PHP4'te görülmektedir. Sınıf yapıcısı içinde $ this başvurusu saklı sürece Bu genellikle farkedilmez. Daha sonra döndürülen nesne üzerinde bir yöntem çağrılırken niyeti sadece bir tane var muhtemelen iken, varlığı nesnenin iki ayrı kopya olacaktır.

Yapıcı bir global var içinde $ this bir başvuru saklar Bu kodu düşünün

class Bar {
    function Bar(){
       $GLOBALS['copy']=&$this;
        $this->str="hello";
    }

}

//store copy of constructed object
$x=new Bar;
$x->str="goodbye";

echo $copy->str."\n"; //hello
echo $x->str."\n"; //goodbye

//store reference to constructed object
$x=&new Bar;
$x->str="au revoir";

echo $copy->str."\n"; //au revoir
echo $x->str."\n"; //au revoir

Birinci örnek, $ x ve $ içinde Foo farklı örneklerine bakın kopyalamak, ancak ikinci onlar aynıdır.

Öncelikle, gerçekten PHP 5 tüm nesneler varsayılan olarak başvuruya göre iletilir, PHP 5 kullanıyorsanız kullanmak gerekmez.

Eğer bir parametre geçirerek, ya da bir değişken değerini ayarlayarak, yaratma yoluyla, bir değişken adına bir nesne atamak İkincisi, ya referans veya değere göre yapıyorlar.

Referans olarak geçen nesne için gerçek bellek başvuru geçirmek, böylece bir işleve parametre olarak bir nesne geçti demek anlamına gelir, fonksiyon bu değişkene yapar herhangi bir değişiklik de ana yöntemi yansıyacak, aslında değişiyor bellekte o nesnenin devlet.

Değere geçmek için alternatif, o nesnenin değil, hafıza referans bir kopyasını geçmek, bu nedenle yaptığınız herhangi bir değişiklik, orijinal yansıyan olmayacak anlamına gelir.

The PHP Manual başvuruları açıklayan oldukça iyi bir iş yok.

Benzerlikler olmasına rağmen ben, bir işaretçi veya diğer birçok dilde de bir referans olarak NOT aynı şey olduğunu, dikkat etmelisiniz. Ve varsayılan olarak "referans olarak geçti" olan nesneler için olduğu gibi - bu da tam olarak doğru değil.

Ben ilk manuel bölümü okuma tavsiye (ve bunu elde edene kadar, muhtemelen daha sonra bir kaç kez yeniden okuma), ve hala daha fazla sorunuz varsa o zaman buraya gelirdi.

Ona bakmak için basit bir yolu bu gibi olabilir:

$a = 'foo';
$b = 'bar';
$a =& $b;
$b = 'foobar';
echo $a . ' ' . $b;

çıktısı

foobar foobar

Bu gibi düşünmek yararlı olabilir: PHP, tüm değişkenler gerçekten bazı işaretçi tür vardır: sembol tablosunda girişleri - değerleri değişken isimlerini eşleyen şey - bir zval * içerir Zend Motoru C uygulaması.

Atama sırasında - Bu fonksiyon argümanları ayar içerir - sihirli olur:

Eğer $a = $b, değerin bir kopyası $b oluşturulacak ve bu yeni değer bir işaretçi için sembol tablosu girişine yerleştirilir edilecektir sembolü tablosu girdisinde tarafından işaret yoksa $a. Şimdi, $a ve $b farklı değerlere işaret eder. PHP varsayılan arama kongre olarak kullanır.

Eğer $a =& $b yaparsanız, için sembol tablosu girdisi $a $b için sembol tablosu girdisinde bulunan işaretçi ayarlanır. Bu demektir $a ve $b şimdi aynı değere işaret - onlar programcı tarafından ribaund kadar eşit haklara sahip birbirinden rumuzudur. Onlar aynı nesneye hem göstericisidir - Ayrıca $a gerçekten bir başvuru olmadığını to $b unutmayın.

'Adlar' onları çağıran C + + 'referans uygulamasına farklılıkları vurgulamak için iyi bir fikir olabilir bu yüzden:

C + +, bu değişken oluşturulan bir değer ve bir başvuru içeren bir değişken eşit değildir - bu başvuruları sarkan böyle şeyler vardır nedeni budur.

Temiz olması için: tüm değişkenler zaten içten işaretçileri olarak uygulanır ve bu nedenle bunların her biri için act, bir referans olarak PHP bir referans türü gibi hiçbir şey yoktur.

PHP5 nesneler hala bu açıklama ile tutarlı vardır - onlar not referans geçti, ama bir pointer to the object (manuel bir 'nesne tanımlayıcı' diyor - bu gerçek bir olarak uygulanabilir olmayabilir C pointer - Ben bu kontrol etmedi) by value () yukarıda açıklandığı gibi atama kopyalanan anlam geçirilir.

details on the relation between PHP5 objects and references için manuel kontrol edin.