Kopyaları anlama & amp;PHP’deki referanslar

PHP’de yeterince iyi olduğumu düşünmeyi seviyorum, ama itiraf ediyorum ki hiçbir şey bilmiyormuşum gibi hissediyorum. Son zamanlarda beni tökezleyen bir şey, değişkenlerin bir kopyası ile değişken referanslar arasındaki farktı. Genellikle, bu farklılıklar fonksiyon özellikleri veya yöntemleri ile devreye girer, ancak bundan daha fazlasıdır. Umarım bu makaleyi okuyarak sizi etkilediğinde bu karmaşık dilin pürüzsüzlüğüyle yüzleşmeye daha iyi hazırlanacaksınız. Referans ve Kopyala Bir değişken oluşturduğumuzda, işlev veya yöntem için argümanı devam ettirerek, neredeyse her zaman bu değişkenin bir kopyasını yaparız. Ancak aksine, referans yapmak isteyebiliriz. Kaynaklar, uygulamamızın iki bölümünün aynı değişken üzerinde hareket etmesini sağlayan takma addır.
Bu, bugün eskisinden çok endişeli olmasa da hafızayı kaydedecektir. Referansları kullanmanın gerçek nedeni yararlı bir tasarım kararıdır, ancak sadece bazen. Farkına bakalım. Önce referans kullanmayan bu sınıfa bakın. Tahmin edin Son Sıradan Ne Çıktı: posta = $ yazı;
}
Genel işlev get_post () {
Dönüş $ this-> gönderi;
}
}
$ Post_Si = Post_si New ();
$ my_post-> set_post ($ yazı);
$ Post = 2;
var_dupp ($ my_post-> get_post ()); Eğer 1 tahmin ederseniz, o zaman haklısın. $ Post’u sınıf kapsamının dışında 2 olarak değiştirdiğimiz için, $ Post kopyasını etkilemez, My_Post sınıfına koyduk. Ama ya istersek? O zaman Referanslarla My_Post sınıfına $ Gönderiye devam etmeliyiz ve Referanslarla Sınıftan Gönderi Özelliğini ayarlamalıyız. posta = & $ yazı;
}
Genel işlev get_post () {
Dönüş $ this-> gönderi;
}
}
$ Post_Si = Post_si New ();
$ my_post-> set_post ($ yazı);
$ Post = 2;
var_dupp ($ my_post-> get_post ()); Burada değişen tek şey, $ Post değişkeninin önüne Amersand’ı koymamdı. Yani şimdi & $ yazı. Amersand, PHP’ye kopya değil referans yapmasını söyler. Sonuç olarak, son satır, şimdi 1 değil, 2 puan aldı, çünkü $ Post’a referanslar sınıfta değiştirildi.
Nesne referanslarıyla ilgili sorunlar Öğrendiklerinize göre, bu koda bakın ve yazdırılacak son satırı tahmin edin: iki = 2;
}
}
ilk $ = yeni stdclass ();
ilk $> iki = 1;
yeni saniye (ilk $);
Var_Dump ($ first-> iki); 1 tahmin ederseniz, yeni okuduğunuza göre mantıklıdır, çünkü ilk nesne referanslarla ikinci nesneye iletilmez. Ayrıca yanlış olacaksınız çünkü nesne her zaman referanslarla geçer. Üzgünüm, seni aldattım, ama bu önemli bir fark. Sorunu gerçekten anlamak ve istediğiniz şey değilse bir çözüm bulmak için kullandığım pratik örneklere atlayalım.
Tork için son makalede, silinen kancayı izlemek için basit bir sınıf yazıyorum. WordPress 4.7’de, kanca hakkında bilgi depolamak için kullanılan, kaldırılan kancaları saklamam gereken yeni bir WP_HOOK sınıfı var, böylece daha sonra ekleyebilirim.
Sınıfın önceki sürümü, nesnenin her zaman referanslarla geçtiğini hatırlayana kadar beni karıştıran nedenlerden dolayı başarısız oldu. Burada netlik için sildiğim geriye dönük uyumluluk sınavını içeren sınıfın son sürümünü görebilirsiniz. Farkı görebilmeniz için sürümü benden önce ve sonra çıkardım.

Başladığım şey bu: kaldırıldı [$ hook] = $ all;
remove_all_filters ($ kanca);
}
}
} Bu sürümde, WP_HOOK sınıfından bir nesne aldım ve nihayet bu sınıftan silinen mülkte saklanan $ tüm değişkenine yerleştirdim. Remove_all_filters () çağırmadan önce mülkte tutmama rağmen, özellikteki değer hala bir referans olduğu için nesnenin arkasını nesnenin arkasını yeniden düzenleyen Remove_all_filters () çağrısından etkileniyor.
Bunu açıklığa kavuşturmak için bu, remove_all_filters () kullanmayan ancak manuel olarak yapılanları yapan sürümdür: kaldırıldı [$ hook] = $ all;
$ all-> geri arama = array ();
} Bunu görebilir ve $ this-> kaldırıldı [$ kanca]-> geri arama boş olmaması gerektiğini düşünebilirsiniz, yalnızca $ all-> geri arama olabilir. Ama her ikisi de iki farklı şey değil, biri diğeri için bir referans. Karşılaştığım sorunun klon çözümü, WordPress Remove_all_filters () nesneyi değiştirmesine izin vermeden önce nesnenin bir kopyasını kaydetmem gerektiğidir. Bir kopyasını tutmak yerine, bir referans yaptım. Bu sorunun çözümü, $ tüm özelliği tanımlarken klon anahtar kelimesini kullanarak bir nesne klonu yapmaktır. Böyle görünüyor: kaldırıldı [$ hook] = $ all;
remove_all_filters ($ kanca);
}
}
} Şimdi $ All, WordPress tarafından çalıştırılan nesneden Remove_all_filters (). Görev tamamlandı. Klonlama nesnelerini klonlamanın sihirli yöntemi bir nesnenin yeni bir kopyasını yapar, ancak tüm özellikleri, yani nesne hala bir referansdır. Bu, PHP’nin yeni nesneler klonlandıktan sonra klonlama nesnelerinde çağrılan bir sihirli yöntem __clone () sağlamasının nedenlerinden biridir.
Bu, gerekirse referans olabilecek herhangi bir mülkü klonlama fırsatı sağlar. İşte bunu yapan bir örnek: $ değer) {
if (is_object ($ property)) {
$ this-> $ Property = Cloning $ this-> $ Property;
}
}
}

admin

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir