PHP’deki sınıflar ve nesneler arasındaki fark
WordPress’in geliştirilmesi için standartlar, doğru soyutlamaya sahip olmayan prosedürel kodların değiştirilmesinden daha sağlam ve nesne yönelimli koda yavaş yavaş hareket eder. Bu doğru yönde bir adımdır, ancak bu tartışmadan sıklıkla göz ardı edilen iki önemli şeyi unutmayın: kodu sınıfa yerleştirmek “nesne yönelimli” olmaz ve nesne yönelimli PHP değil, Daha iyi tanıma göre. Bugün, nesnenin ne olduğunu ve rolünün ne olduğunu tartışacağız. O zaman “gerçek nesne yönelimli programlama” ile ne demek istediğimizi ve kodunuzun “gerçek OOP” olup olmadığı gerçekten önemli olup olmadığını tartışabiliriz.
Dizi vs PHP nesneleri iki kombine veri türüne sahiptir (kompozit olarak da bilinir): nesneler ve diziler. Birleştirilmiş veri türü kompozisyon gerektirir – diğer veri türlerini bir “birim” olarak birleştirme işlemi. Saf nesne yönelimli dilde, PHP’de ilkel türler olarak mevcut olan Veri Türlerini derlemeliyiz. Nesneleri ve nesne yönelimli programlamayı açıklarken, bir nesne olmayan dizi hakkında konuşarak başlamanın çok yararlı olduğunu düşünüyorum. PHP dizisi ve nesneler arasındaki temel fark, dizi kurallarını değiştiremeyeceğimizdir. PHP dili, dizi ile neler yapabileceğimizi ve yapamayacağımızı tanımlar ve PHP programınızın değiştirmesinin bir yolu yoktur.
Öte yandan nesneler, çalıştırdıkları PHP programı tarafından belirlenen kurallara sahiptir. Bu kurala sınıf denir. Her dizi aynı kurallarla oynarken, her nesne nesnenin kuralları ve bunu yapmak için kullanılan sınıf kurallarıyla oynar. Örnekler bazen “sınıf” ve “nesneler” kelimeleri dönüşümlü olarak kullanılır, ancak olmamalıdır. Yukarıda söylediğim gibi, sınıf nesneler yapmak için bir kuraldır, ancak nesne kullanılana kadar mevcut değildir. Sınıf ajansları yeni anahtar kelimeler kullanılarak gerçekleşir. WP_Query sınıfının bir türevini istiyorsam, şöyle yapabilirim: $ ürün = yeni wp_query ([‘post_type’ => ‘ürün’]); Sınıf örnekleri ve çağrı işlevleri oluşturmak çok benzer, ancak işlev çağrılarından önce yeni anahtar kelimeler gelmez. Bir sınıf kullanıldığında, yapıcı derhal çağrılır ve sınıfa enjekte edilen herhangi bir argüman yapıcıya iletilir. Yapıcı PHP Magic yönteminin bir örneğidir. Doğrudan nesneye veri enjekte etmenin ve aynı zamanda kodu başlatmanın hemen çalıştırmasının bir yoludur. Fark ettiğiniz gibi, bir nesne örneği yaptığımda WP_Query sınıfına devam ettim. WP_Query yapıcısına bakarsanız, aldığı bir argüman boş değilse, bağımsız değişken sınıf sorgu yöntemine iletilir.
Sorgu yöntemi, wp_query için kullanılan işlemi başlatır – bir veritabanı göndermek için bir veritabanı istemek. Yöntemi yapıcıdan ayırmak iyi bir tasarımdır, çünkü yapıcının çok fazla sorumluluk almamasını sağlar. Bu aynı zamanda kuyruğun ne zaman çalıştırıldığını kontrol etmemizi sağlar. Çoğu zaman kuyruğu derhal çalıştırmak için bir sorun olmasa da, query () () __construct () ‘dan ayıran esneklik çok kullanışlıdır. WP_Query’nin birçok kuralı olmasına rağmen, kurallar tüm nesneler veya wp_qury için geçerlidir, bu tüm wp_query nesnelerinin aynı olduğu anlamına gelmez. Çünkü mülkleri farklı bilgiler içerecektir. Örneğin, şu kod bkz.: $ Ürün = yeni wp_query ([‘post_type’ => ‘ürün’]);
$ sipariş = yeni wp_query ([‘post_type’ => ‘sipariş_toko’); Şimdi iki WP_Query sınıfı örneğimiz var. Her biri yayınlarında tamamen farklı bir yayınlar içerecek, ancak oraya göndermenin yolu ve erişilebilecek veya değiştirilebilecekleri aynıdır.
Nesne bir örnek mi? Son bölümde, wp_query örneği olan nesne hakkında konuştum. Demek istediğim, bu nesnelerin WP_Query sınıfı kullanılarak yapılmasıdır. Ancak, sınıfın alt sınıflandırılabileceğini unutmayın. Bir nesne, diğer sınıfları genişleten sınıfın bir türevi olduğunda, her iki sınıfın bir türevi olarak kabul edilir.
Bu önemli bir farktır, çünkü IS_A () işlevinin nasıl işlev göreceğini ve tür kurallarını nasıl işleyeceğini belirler.WP_Query’yi genişleten bir sınıf yaparsam, WP_Query’nin bir türevi olarak kabul edilir.Bu, onu çok kullanışlı kılan bir nesne mirasının özelliklerinden biridir.”Sosyal” adlı soyut bir sınıfınız ve genişleyen iki sınıfınız “Facebook” ve “Twitter” olarak adlandırılır.Bu sınıflardan örnekleri “sosyal” örnekleri olup olmadığını kontrol ederek tanımlayabilirsiniz.Bu $ nedir?Sınıfta, geçerli bir değişken $ this kullanarak geçerli örneğe erişebilirsiniz.Sınıf dışında $ this kullanamazsınız veya PHP hatalara neden olur.Sınıfta, mülk veya sınıf yöntemine erişmek için $ bunu kullanırsınız.
$ Bu değişken, miras hiyerarşinizde hangi sınıfta olursa olsun, her zaman geçerli nesneyi ifade eder.Öte yandan, “self” anahtar kelimesi şu anda bir örnek değil, mevcut sınıfa atıfta bulunur.Statik özellik belirli nesnelere özgü değildir, sınıfa özgüdür.Nesneye yönelik programlama “True” Genellikle görünür olan nesneyi gerçekten temsil etmeyen bir sınıf görürüz.Tersine, bunlar ilgili işlevlerin bir koleksiyonudur.Bu durumda, sınıf bir ad alanı görevi görür.Bu mümkün ya da belki de kötü bir şey değil.Bu durumu her zaman vaka başına vakalara göre test etmeliyiz.Bence, kodun sınıfta bulunmayan bir işlev koleksiyonu olarak yeniden yazılıp yeniden yazılamayacağına bağlıdır.Bunu söylüyorum çünkü sınıf yazmak, sadece benzersiz işlev öneklerinin kullanımından kaçınmak için sınıf kullanmak için bir neden ve performans eksikliği ve daha az esnek değildir.
Bir sınıfın tek yardımcı programı benzersiz bir önek kullanmaktan kaçınmaksa, neden dosyaya grup işlevleri olmasın ve o dosyadaki ad alanını kullanmıyorsunuz? Bununla birlikte, sınıfın bir grup işleve ait olmayan miras, görünürlük ve mülke sahip olduğunu unutmayın. Bu, “gerçek” nesne yönelimli bir PHP olmasa bile sınıf kullanmak için çok iyi bir nedendir. Bu durumda, genellikle bir örneğin bir diğerinden ayırt edilemeyeceği sınıflarla ilgilenirsiniz. Bu sınıfları nesnelere oluşturmak ve nesneleri izlemek neredeyse her zaman kokulu ve gereksiz bir koddur. Bu durumda, tüm statik sınıf yöntemlerini bildirmek genellikle daha iyidir, bu nedenle somutlaşmaya gerek yoktur. Birçok insan size sadece sınıf kullandığınız için nesne yönelimli programlama kullandığınız anlamına gelmediğini söyleyecektir. Haklılar. Sadece bu, nesne yönelimli programlamanın kategorik olarak alternatiften daha iyi olmadığını unutmayın.