Nesneye yönelik PHP’de görünürlük kavramını anlayın

Son zamanlarda PHP’deki Nesneye Yönelik Programlama (OOP) prensipleri hakkında çok yazdım. OOP çok iyidir, çünkü kod kapsüllemesini teşvik eder: kendi kapsamı ve amacı ile ayrı işlevler, sınıflar ve yöntemler. Mülkiyet, değişkenler ve farklı kapsülleme kapsamı yöntemlerine nasıl eriştiğimiz kuralı görünürlük ile belirlenir. Bu makalede, görünürlüğün nasıl tanımlandığını, nasıl çalıştığını ve OOP PHP’de neden önemli olduğunu açıklayacağım. Bu makalenin bu ilkelerin PHP 5.4 veya daha yeni bir işleyişini ifade ettiğini unutmayın. PHP 5.3 ve altında OOP’yi doğru bir şekilde yapmak için ana özelliği yoktur. Ayrıca 5.4’ten fazla dramatiktirler ve dilin diğer önemli sözdizimsel özelliklerini kaybederler. Bence, güvenlik desteği eksikliği nedeniyle, kimse tarafından kullanılmamalı veya desteklenmemelidir.
Kapsülleme ve Kapsam Yazılım tasarımında, kapsüllemeyi kodun ve verilerin tüm programlamaya erişimlerini sınırlayacak şekilde birleştirildiği bir prensip olarak görüyoruz. Kapsüllemenin en basit örneği işlevdir. Bu PHP kodunu düşünün: $ post = get_post (1);
Slug_get_post_five () işlev {) {
$ post = get_post (5);
Var_Dump ($ Post);
}
Var_Dump ($ Post);
slug_get_post_five (5); Nesne yönelimli PHP kullanmayan bu örnekte, “var_dupp ();” ile basılan yazı adı verilen iki farklı değişkenimiz var. İkinci “$ Post” bir işlevde yüklenirken, tamamen farklı iki şey puan alacaklar.
Bu durumda, ikinci $ yazının “slug_get_post_five () işlevine yüklenmesi, onu yukarıdaki $ gönderinin farklı bir kapsamına yerleştirir, bu da onu tamamen farklı bir değişken haline getirir. Benzer görünüyorlar çünkü onlara aynı adı veriyorum, ama ilişkileri yok. Aslında, yürütüldüğünde RAM sunucusunda iki ayrı varlık olarak saklanırlar. OOP olmayan PHP’de, işlevin dışındaki erişim kontrollerini işlevde bildirilen değişkenlere bildirmek için iyi bir yolumuz yoktur. Bir işlevin bir değerini geri yükleyebiliriz. Bir işlevin bir değerini döndürebiliriz. Küresel kapsamı da kullanabiliriz, ancak değişkenlere işlevin dışından nasıl erişildiği konusundaki kontrol eksikliğinin yanı sıra birçok nedenden dolayı bir karmaşadır. OOP ise bize mülk dediğimiz sınıf değişkenlerine erişimi kontrol etme yeteneği verir. Bu, OOP’un ana avantajlarından biridir – mülk ve sınıf yöntemleri için üç “görünürlük” seviyemiz vardır. Sınıf vs Nesneler Görünürlüğe girmeden önce, aralarındaki farklılıkların net olmasını sağlamak için sınıf ve nesneler arasında hızlı bir şekilde ayrım yapmak istiyorum. Sınıf, yaptıkları nesne için bir dizi kural tanımlar. Nesneler, nesnenin ne yapabileceğini belirleyen sınıf örnekleri oluşturarak yapılır.
Bunu her zaman WP_Query sınıfı ile WordPress’te gördük. Global değişkende, “$ wp_query”, geçerli HTTP isteğine dayanarak WordPress tarafından yapılan WP_Query sınıfının nesnesidir. Ancak oturum sırasında ihtiyaç duyduğumuz kadar çok WP_Query nesnesi yapabiliriz. Her WP_Query nesnesi aynı yöntem ve özelliğe sahiptir, ancak özelliğin değeri veya yöntemin sonuçları farklı olabilir. Örneğin, dönem arşivleri kategorisi için bir URL isteyerek yapılan oturum sırasında, “ürün” özel yazı türünden yayınları eklemek ve $ ürün adı verilen bir değişkende saklamak için yeni bir WP_Query nesnesi oluşturduğumuzu söyleyin. Case, “$ ürün” ve global “$ wp_query” hem WP_Query sınıfının nesnesidir. Her ikisinin de sorulan yayınları tutan “$ gönderiler” adlı bir özelliği var, ancak tuttukları yayınlar tamamen farklı. Aslında, her yazı WP_Post sınıfından nesnelerle temsil edilir – aynı sınıf ancak tamamen farklı nesnelerle. Benzer amaçlar için kullanılan bazı nesneleri yapmak için bir sınıf kullanmak iyi bir yazılım tasarımıdır. Veritabanından bazı WordPress yayınları almam gerektiğinde özel bir veritabanı sorgusu yazmam zor olurdu.
Sınıflar, üst sınıfın kurallarını ekleyen ve değiştiren alt sınıf adı verilen ikinci bir sınıf eklenerek genişletilebilir. Bu, görünürlüğün neden ve nasıl çalıştığını anlamak için çok önemlidir: alt sınıf özellik veya yöntem olabilir. OOP PHP’de üç görünürlük seviyesi Mülkiyet ve sınıf yöntemleri için üç görünürlük seviyemiz vardır: genel, korunan ve kişisel. Görünürlük, mülkün veya yöntemin görünürlük seviyesini ifade etmek için görünürlük anahtar kelimesi kullanılarak bildirilir. Üç seviye, mülkün veya yöntemin sınıf dışında ve sınıfı genişleten sınıfta erişilip erişilemeyeceğini belirler. Halkın ilk seviyesi “kamuya açıktır”. Bu seviyenin herhangi bir kısıtlaması yoktur, yani herhangi bir kapsamda çağrılabilir. Bu, bir nesnenin genel mülkünün, örneğin sınıfta, alt sınıfta veya sınıf dışından bir programın herhangi bir yerinden alınabileceği ve değiştirilebileceği anlamına gelir. Bu seviye, görünürlüğü olmayan PHP4 ile geri çekilme sorunu nedeniyle görünürlük bildirilmediğinde varsayılan davranıştır. Teknik olarak, yöntemin bildirilmesinin, onu herkese açık hale getiren anahtar kelime görünürlüğü ile devam etmesi gerekmez. Ayrıca, mülk, kamuya açık hale getirmek için “var” anahtar kelimesi kullanılarak tanımlanabilir. Ancak gelecekte uyumluluk nedeniyle ve böylece kodunuzun amacıyla açık olması için, her zaman görünürlüğü anahtar kelimesini kullanmalı ve VAR anahtar kelimesini kullanmamalısınız.
Korumalı ikinci seviye “korunur”. Korumalı özelliklere ve yöntemlere, bildirilen sınıftan veya onu genişleten herhangi bir sınıfta erişilebilir. Sınıftan veya alt sınıftan erişilemezler. Kişisel mülk ve korunan yöntemlere nesnenin herhangi bir yerinde erişilebilirken, üçüncü seviye “kişisel” daha sınırlayıcıdır. Özellik veya kişisel yöntemlere, alt sınıf tarafından onu tanımlayan sınıftan erişilemez. Korumalı mülk ve kişisel mülkiyete sahip bir sınıfınız varsa ve daha sonra sınıfı alt sınıftaki genişletirse, korumalı mülke erişebilirsiniz, ancak özel olarak erişemezsiniz ve üçüncüsü de hatalar yapar, çünkü sınıfta görünürlük kurallarını ihlal eder . Sınıf Gücü {
/**
* Bu korumalı özelliğe alt sınıfta erişilebilir
*/
korumalı $ jedi;
/**
* Bu özel mülke alt sınıfta erişilemez
*/
Kişisel $ Sith;
Genel işlev set_force_user ($ jedi, $ sith) {
// Her ikisi de yasaldır çünkü aynı sınıftayız, özel vs korumalı çok anlamlı bir fark değil
$ this-> jedi = $ jedi;
$ this-> sith = $ sith;
}
}
Sınıf Jedi gücü genişletir {
/**
* Bu iyi bir örnektir.
*/
Genel işlev set_jedi ($ jedi) {
// Gerçekten yasal çünkü Jedi korunuyor ve bu nedenle bu alt sınıfta erişilebilir
$ this-> jedi = $ jedi;
}
}
Sınıf Sith gücü genişletir {
/**
* Kötü bir şeyin örnekleri, Sith gibi biliyorsunuz, bunu yapma.
*/
Genel işlev set_sith ($ sith) {
// İzin verilmiyor, bu $ alt sınıf-> sith = $ sith’de ana sınıfın özel mülkiyetini yönetemeyiz;
}
} Bunun içinden geçelim. Temel sınıfımız iki mülk ilan etti: “$ jedi” ilk mülkiyeti korumalı, ikinci mülk olan “$ Sith” özeldir. Sınıf, her iki özelliği de yönetmek için bir yöntem kullanır. Bu durumda, özel ve korunan arasındaki fark anlamsızdır çünkü değerlerini sınıf dışından ayarlayamayız, ancak içinde bir sorun değildir.
İkinci sınıf birinci sınıfı genişletti ve korumalı mülk olan “Jedi” ni yönetmek için yeni bir yol ekledi. Korumalı özelliklere alt sınıfta erişilebilir ve tüm nesnelerde mevcuttur. Üst ve alt sınıf sınıfı nesnenin bir parçasıdır. Üçüncü sınıf, görünürlük kurallarını ihlal ettiğimiz yerdir. Özel mülkiyet $ Sith’e alt sınıfta erişilemez. Yalnızca tanımlandığı sınıfta erişilebilir. Bu yasal olarak Sith adlı özel bir mülk tanımlayarak alt sınıfta yapabilirsiniz, ancak kötü bir çözümdür. Bir “Jedi” sınıf örneği oluşturmak ve “$ Luke” değişkenine koymak istiyorsak, “$ jedi” ni korumalı özelliği ayarlamak için “set_jedi ()” yöntemini kullanabileceğimizi unutmayın, ancak yapamayız doğrudan yönetin.
// SET_Jedi yöntemi herkese açık olduğu için izin verildi
$ Luke = New Jedi;
$ Luke-> set_jedi (‘Luke Skywalker’);
// izin verilmiyor çünkü Jedi’nin mülkü korunuyor
$ kylo = new jedi ();

$ kylo-> jedi = ‘Kylo Ren’; İlk iki satırda, “set_jedi ()” genel yöntemi, korunan sınıf özelliğini yönetmek için doğru kullanılır. Bu yasaldır çünkü ayar sınıfta gerçekleşir. Bu örnekteki iki ikinci sıra PHP hataları yapacaktır, çünkü korumalı özellikleri sınıf dışından ayarlamaya çalışıyoruz. PHP tercümanları tarafından yasaktır. Mülkiyeti yankılamaya çalışırsak aynı şey olur. Bir özelliğin alt sınıfında daha görünür hale getirilebileceğini, ancak daha az görünür hale gelmediğini bilmek de önemlidir. Bu tür bir değişime izin verilir, ancak iyi bir uygulama olarak kabul edilmez. Alt sınıf, ana sınıftan korunan mülkiyet olabilir ve halka açık hale getirebilir, ancak onu özel yapmaz. Sınıf gemisi {korumalı $ modeli;
}
/**
* Modelin daha görünür hale getirilmesi izin verilir, ancak kafa karıştırıcı ve kıvrımlı.
*/
Sınıf kaşif gemisi genişleyen gemiler {
genel $ modeli;
}
/**
* Modelin daha fazla izin verilmemesi.
*/
Sınıf Star_Destroyer Genişleyen Gemi {
özel $ model;
} Yöntemimin görünürlük kuralları, şu ana kadar yöntemlere değil, mülkiyete odaklanmıştır, çünkü mülk hakkında söylediğim hemen hemen her şey, birkaç ek kural hariç, yöntem için de geçerlidir. Temel ilkeler hala geçerlidir:
Bir sınıfın genel yöntemleri sınıf dışında veya alt sınıfın içine çağrılabilir.
Korumalı yöntemler sınıfın dışında çağrılamaz, ancak alt sınıfın içine çağrılabilir.
Bir sınıfın özel yöntemi yalnızca beyan ettiği sınıfta çağrılabilir.
Force_user class {
özel $ IS_FORCE_USER;
korumalı $ adı;
Genel işlev __Construct ($ name, $ is_force_user) {
$ this-> name = $ name; $ this-> set_is_force_user ($ is_force_user);
}
Kişisel işlev set_is_force_user ($ IS_FORCE_USER) {
$ this-> is_force_user = boolval ($ is_force_user);
}
Korumalı işlev is_force_user () {
Dönüş $ this-> is_force_user;
}
}
Jedi’nin sınıfı Force_user’ı genişletiyor {
genel işlev has_the_force () {
// yasal çünkü IS_FORCE_USER () korunur ve bu nedenle alt sınıfta erişilebilir
Return $ this-> is_force_user ();
}
}
Sınıf Sith Genişleyen Force_user {
public işlevi remove_force () {
// Yasal değil, kişisel yöntem, alt sınıfta erişilemez
$ this-> set_is_force_user (false);
// Mülkiyet özel mülkiyet olduğu için yasal değil
$ this-> is_force_user = false;
}
} Bu örnekte, temel sınıf kişisel mülkü yönetmek için kişisel işlevleri kullanır. Korumalı işlevler tarafından maruz kaldığı için alt sınıf tarafından erişilebilir. “Jedi” alt sınıfında olan şey budur, ancak özellik ve ayarlama yöntemi kişisel olduğu için, alt sınıfta değiştirmenin bir yolu yoktur. “Sith” alt sınıfı, ana sınıfta bildirilen özel mülkiyet ve kişisel yöntemleri kullanmaya çalışır, bu yasal değildir. Tıpkı mülk gibi, yöntem alt sınıfta daha görünür olabilir. Kişisel yöntemi korumalı bir yöntemle değiştirerek “Sith” sınıfındaki iki sorundan birini çözebiliriz. Yöntemi yararlı hale getirmek için, korunan mülkü de yapmalıyız. Başarılı olacak, ancak tamamen yeni bir sınıf yazmak yerine neden alt sınıfı kullandığımız sorusunu gündeme getirecek. Aşağıda, hataları önlemek için bu değişikliği uygulayan “Sith” sınıfı: Sınıf SITH’yi genişletir Force_user {// şimdi ona erişebilmemiz için korunuyor
korumalı $ IS_FORCE_USER;
public işlevi remove_force () {
// Yasal değil, kişisel yöntem, alt sınıfta erişilemez
$ this-> set_is_force_user (false);
// Mülkiyet özel mülkiyet olduğu için yasal değil
$ this-> is_force_user = false;
}
// işlevini manuel olarak kopyalamayı gerektiren korunan olarak değiştirildi
Korumalı işlev set_is_force_user ($ is_force_user) {
$ this-> is_force_user = $ is_force_user;
}
} Gördüğünüz gibi, burada temel sınıfın genişletilmesinin bir anlamı yoktur.Şimdi, SET_IS_FORCE_UNER () () yönteminin üst sınıfta çalışma şeklini değiştirirsek, sınıfı genişletme yardımcı programını kaybettik çünkü alt sınıfta manuel olarak değiştirmeliyiz.Bu tür bir çözüme bazen diğer kişilerin koduyla çalışırken gereklidir.Bu tür şeylerin “kod kokusu” olduğu düşünülür
Kötü, teknik olarak yanlış olmamasıdır, ancak bu bir kod fikri olduğu anlamına gelmez. Mülkle birlikte, görünürlükteki değişiklikleri önlemenin veya vurulmasını önlemenin bir yolu yoktur. Mevcut yöntemlerle – yöntemin beyanında “Final” anahtar kelimesini kullanabiliriz. Bunu yaptıktan sonra, görünürlükteki değişiklikleri engelleyen O’nun başına gelmesi yasadışıdır. Son anahtar kelime hafifçe kullanılmalıdır. Şimdi isteyebileceğiniz görünürlükteki değişiklikleri önlemek için kullanılabilse de, bunu yalnızca bu nedenle kullanmak iyi bir fikir değildir. Diğer geliştiricilere esneklik ve özgürlük sağlamalısınız. Son zamanlarda bir yöntemi değiştirebilmem için üçüncü taraf kütüphane sınıfını genişletmem gereken bir proje üzerinde çalıştım. Bu yöntemde, kişisel mülke erişmem gerekiyor, böylece alt sınıfımda korunmak için görünürlüğünü değiştiriyorum. Bunu yapmadan, belki de yapıcıyı bir kenara koyarak ve özel mülkün bir kopyasını yaparak çok daha karmaşık bir çözüm yazmalıyım. Görünürlük neden şimdiye kadar görünürlük kurallarını tartıştım, ancak neden bunu önemsediğimizi ve niyetle kullanması gerektiğini gerçekten tartışmadım. OOP PHP kodumuzda görünürlüğü kullanmanın birkaç nedeni vardır: Bu, kodumuzun amacını göstermemize yardımcı olur
Dahili olarak kullanıldığında mülkü doğrulama ihtiyacımızı azaltır
Ve bu, sınıfın nasıl kullanılması gerektiğini dikte etmeye yardımcı olur.
Örneğin, bu sınıfı düşünün: ışın kılıcı sınıfı {
genel $ adı;
korumalı $ renk;
Genel işlev set_name ($ name) {
if (is_string ($ name)) {
$ this-> name = $ name;}
}
} Bu durumda, mülkün adını herhangi bir şey olarak ayarlayabiliriz. Daha sonra “$ name” kullanan bir kod yazmak ve bir dize olarak düşünmek istiyorsak, bu bir sorundur. Özelliği her kullandığımızda bir dize olduğundan emin olmalıyız. Tersine, mülkün rengi korunur. Düzenlemeden önce bir dize olup olmadığını doğrulayan genel bir set işlevine sahiptir. Şimdi mülkü dahili olarak çağırırken bunun bir dize olduğunu varsayabiliriz. Değişken tip varsayımı, dinamik olarak yazılan bir dilde tehlikeli bir varsayımdır, ancak bu riski azaltmanın bir yoludur. Ayrıca, korunan veya kişisel mülkiyet elde etmek için halka açık bir işleve sahip olarak, sınıfın ne kullanımını açıklıyoruz. Örneğin, çok fazla veri alan, birkaç işaretleme yapan ve $ HTML adlı korunan bir değişkene koyan ve daha sonra bu değişkeni elde etmek için genel bir yöntem varsa, bir sınıfım varsa, Sınıf noktası bir HTML işaretlemesi oluşturmaktır. Son birkaç kelime son iki noktayı yapmak istiyorum. Birincisi, bu kuralın karmaşıklığının, yorumlanan PHP tercümanıyla fikirleri kullanmanızın birçok nedeninden biri olmasıdır. PHPStorm kullanıyorum ve bu makaleye “Kötü Örnek” için bir örnek kod yazdığımda

admin

Bir Cevap Yazın

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