PHP 8.1'de salt okunur özellikler nasıl kullanılır -
PHP 8.1, bir readonly
sınıf özelliklerinde değiştirici. Bu şekilde işaretlenen bir özellik yalnızca bir kez tanımlanabilir. Başlatmadan sonra salt okunur bir özelliğin değerini değiştirmeye çalışmak bir hata üretecektir.
"Salt okunur", bireysel programlama dilleri için çeşitli etkileri olan oldukça gevşek bir terimdir. Bu bağlamda, "salt okunur" aslında "değişmez" anlamına gelir: bir özelliğin değerini ayarlayabilirsiniz, ancak daha sonra değiştirilemez.
özet
Salt okunur özellikleri yazma
Ekle readonly
bir özelliği salt okunur yapmak için değiştirici. Özelliğin erişim değiştiricisi ile tür göstergesi arasına yerleştirilmelidir.
sınıf Gösteri { halka açık dizi $ Değişken; halka açık salt okunur dize $ Değişmez; halka açık işlev __yapı( dizi $ Değişken, dizi $ Değişmez) { bu $ -> Değişken = $ Değişken; bu $ -> değişmez = $ Değişmez; } }
$Mutable
sıradan bir kamu yararıdır. Değerini istediğiniz zaman sınıf yöntemlerinde veya dışarıdan değiştirebilirsiniz:
$ demo = yeni Gösteri("A", "X"); $ demo -> Değişken = "B";
$Immutable
biraz farklıdır. Değerini her zaman istediğiniz zaman okuyabilirsiniz, ancak herhangi bir değişiklik başarısız olacaktır. Error
:
// Hata Atıyor $ demo -> değişmez = "Y";
Le readonly
değiştirici, terfi edilen kurucu özelliklerinde de desteklenir:
sınıf Gösteri { halka açık işlev __yapı( halka açık salt okunur dize $ Değişmez="foobar" ) {} }
Yükseltmeyi varsayılan bir değerle kullanırken, özelliği yine de yapıcınızda manuel olarak ayarlayabilirsiniz. Bu fonksiyon parametresi özellik örneğini değil, varsayılanı alır. Önceki örnekte gösterilen aynı kodda şeker teşviki.
Uyarılar
Salt okunur özellikler, uygun gördüğünüz şekilde benimseyebileceğiniz basit bir sözdizimi geliştirmesidir. Geriye dönük uyumluluk etkileri yoktur ve kullanımları tamamen isteğe bağlıdır. Bunları eklemeye başlıyorsanız, bilmeniz gereken birkaç uyarı ve sınırlama vardır.
Klasik özelliklerin aksine, salt okunur özelliklerin tanımlarında varsayılan bir değere sahip olmalarına izin verilmez:
sınıf Gösteri { korumalı salt okunur dize $ foo = "Çubuk"; }
Bu talimat tanımlar ve başlatır $foo
. Başlattıktan sonra değerini değiştiremezsiniz, bu nedenle özellik aslında bir sabittir. Bu nedenle, varsayılanlar yasaktır ve bunun yerine gerçek bir sabit kullanmalısınız:
sınıf Gösteri { const foo = "Çubuk"; }
Bu kısıtlamanın ardından, readonly
mekanik olarak seulement yazılan özelliklerde desteklenir. Aşağıdaki mülkün geçersiz bir tanımı var:
sınıf Gösteri { korumalı Sadece oku $ foo; }
Türlenmemiş bir özellik, örneğin $foo
yukarıda, örtük bir varsayılan var null
. Evet readonly
izin verildi, "örtülü sabit yok" kuralı yeniden ortaya çıktı. Yazılan özellikler, "başlatılmamış" ve "boş" durumları birbirinden ayırır, böylece siz açıkça bir tane tanımlayana kadar herhangi bir değer olmadan var olurlar.
Salt okunur değiştirici, sınıf mirasının bir parçası olarak kullanıldığında özel kurallara sahiptir. Alt sınıflar eklenemiyor veya kaldırılamıyor readonly
ebeveynleri tarafından tanımlanan özellikler hakkında.
Yazılabilir bir özellik oluşturun readonly
yöntemleri değeri mutasyona uğratırsa, üst sınıfı bozar. Kısıtlamanın kaldırılması görünüşte zararsız olsa da, RFC readonly
kalıtım geçersiz kılmalarına izin verilirse kaybedilecek yetenekler üzerinde "kasıtlı bir kısıtlama" olarak. Bu, ebeveyn sınıfların, salt okunur olması gereken özellikleri değiştirerek çocukların yan etkilere neden olamayacağını iddia edebilmesi için yasaktır.
Salt okunur özellikler yalnızca ayarlandıkları kapsamda ayarlanabilir. Bu demektir public
özellikler, daha önce başlatılmamış olsalar bile, bir sınıfın dışından ayarlanamaz:
sınıf Gösteri { halka açık salt okunur dize $ foo; } $d = yeni Gösteri(); $d -> foo = "Çubuk"; // yasadışı
Başlatma, özelliği tanımlayan sınıfta gerçekleşmelidir. Sonuç olarak, salt okunur özellikler, önceden var olan PHP özelliklerinin aksine, diğer programlama dillerinin değişmez alanlarına daha yakındır.
Le readonly
değiştirici ayrıca tüm gönderiler için de geçerlidir. Dahili ve harici erişim arasında ayrım yapmaz. Gelecekteki bir belirtim uzantısı buna izin verse de, genel olarak salt okunur ancak sınıfta yazılabilir bir özelliğiniz olamaz.
Son bir tuzak, clone
anahtar kelime. Bu kod çalışmayacak:
sınıf Gösteri { halka açık işlev __yapı( halka açık dizi $ foo ) {} } $d = yeni Gösteri("Çubuk"); $ d2 = clone $d; $ d2 -> foo = "foobar";
Klonlama, geleneksel mülklere erişimle aynı kuralları izler. değişse bile foobar
bu ilk kez foo
üzerinde erişilebilir $d2
, özellik klonlama işlemi tarafından zaten başlatıldı. Klonlama sırasında örtük bir başlatma var.
Salt okunur özellikler ne zaman kullanılır?
Salt okunur özellikler, veri yapılarını temsil eden basit sınıfların oluşturulmasını büyük ölçüde hızlandıracaktır. HTTP istek parametrelerini, veri aktarım nesnelerini ve yanıt verilerini tutmak için atılabilir sınıflar yazmak yaygındır. Bunlar genellikle değişmezdir ve özelliklerin sınıf oluşturulduktan sonra değişmemesi gerekir.
Önceden, struct türünde sınıflar yazarken iki çekici olmayan seçeneğiniz vardı: genel özellikleri kullanın, geliştirmeyi hızlandırın ancak değişikliğe izin verin veya korumalı özellikleri ortaya çıkarmak için elle alıcı yöntemleri ekleyerek zaman harcayın.
// İdeal değil - Özellikler harici olarak değiştirilebilir sınıf Kullanıcı Oluşturma İsteği { halka açık işlev __yapı( halka açık dizi $ Kullanıcı adı, halka açık dizi $ Şifre ) {} } // İdeal de değil - Çok sayıda ortak kod sınıf Kullanıcı Oluşturma İsteği { halka açık işlev __yapı( korumalı dizi $ Kullanıcı adı, korumalı dizi $ Şifre ) {} halka açık işlev getKullanıcı adı() : dizi { dönüş bu $ -> Kullanıcı Adı; } halka açık işlev şifre al() : dizi { dönüş bu $ -> Şifre; } }
Salt okunur özellikler sonunda ideal yaklaşıma izin verir:
sınıf Kullanıcı Oluşturma İsteği { halka açık işlev __yapı( halka açık salt okunur dize $ Kullanıcı adı, halka açık salt okunur dize $ Şifre ) {} }
Mülkler herkese açıktır ancak değiştirilemez. Yapıcı özelliklerinin tanıtımıyla birleştiğinde, salt okunur özellikler, ortak kod kodunu önemli ölçüde azaltmayı vaat ederek faydalı sınıfları daha hızlı yazmanıza olanak tanır.
readonly
ayrıca kodun okunmasını kolaylaştırır ve niyetlerinizi daha iyi belirtir. Okuyan veya düzenleyen herkes UserCreationRequest
sınıf, özelliklerinin değişmemesi gerektiğini bilir. İlk örnekte, projedeki başka bir kodun sınıfın özelliklerini doğrudan değiştirip değiştirmediğini bilmiyoruz. İkinci örnek biraz daha açıktır, ancak yine de bir geliştiriciyi fazlalıklar uygulamaya teşvik edebilir. setUsername()
et setPassword()
yöntemler.
Sonuç
Le readonly
değiştirici, PHP sınıfı özellikleri için yerleşik değişmezlik desteği sağlar. Bu, kodunuzu daha net hale getirir ve çalışma zamanı değişmezliğini zorunlu kılarak kasıtsız değer değişikliklerini önler.
PHP 7 yayın serisine geri dönersek, yapı benzeri bir temel sınıf oluşturmak, yazılan özelliklerin ayarlanmasını, bu özellikleri tanımlayan bir kurucunun yazılmasını ve ardından bunun için alıcı yöntemlerinin eklenmesini içeriyordu. PHP 8.1 ile, tüm bunları birleştirerek tek bir kurucu imzasında toplayabilirsiniz. public readonly
ve emlak promosyonu.
PHP 8.1'in en son geliştirme sürümlerinde salt okunur özellikler uygulanmaktadır. Üretime hazır versiyon Kasım 2021'de gelecek.