WordPress kodunuzu artırmak için bir servis kapsayıcısı kullanın
Bu makalede, ilk seri, konteyner kavramlarını tanıtacağım ve çok basit ama sınırlı kapların nasıl oluşturulacağını ve uygulanacağını göstereceğim. Bu makale, optimal değil basit olmayan Sington kullanma kavramını göstermektedir. Not, bu örnek kod Sington kullanmaya başlayacaktır. Bunun en iyi uygulama olmadığını biliyorum, ancak kapları öğretmeyi kolaylaştıracak. Sonunda, Singleton ile ilgili gerçek sorunu açıklamanın bir yolu olarak konteyner sınıfından Sington desenini sileceğim. Konteynerlerle başlayarak, kapsayıcıyı uygulamanızda bir nesne örneği depolayan veya oluşturabilen merkezi bir nesne olarak düşünün. Bir konteynere duyulan ihtiyaç, hala bağımlılık enjeksiyonu kullanırken paylaşılan bir nesne örneği gerektirir.
Bununla, kaçınmaya çalıştığımız sorunlara bakarak başlayalım. Twitter yemiyle etkileşim kurmak için bir sınıf yazdığınızı düşünün. Bu, kendi sınıfı olması gereken bir Twitter hesabıyla çalışmak ve kaydetmek için bir yol gerektirecektir – böylece birçok hesaba sahip olabilir ve sınıfı yeniden kullanabilirsiniz. Buna ek olarak, bu, kendi sınıfı olması gereken bir yangın müşterisi gerektirecektir, çünkü hem ayrı hem de kullanışlı sorunlar bağımsız olarak. Şimdi, bir sınıfımız var, sadece iki sınıfın çalışması gereken Twitterfeed’i arayın. Bunu yapmanın en basit yolu şudur:
twitterAccount = yeni TwitterAccount ();
$ this-> twitterapi = yeni TwitterApi ();
}
} Bu uygulamanın çalışması için, doğru hesabı almak ve API istemcisine bağlamak için TwitterFeed sınıfına mantık eklemeliyiz. TwitterFeed’in Twitterfeed alma yeteneğini eklemeden TwitterFeed’e iki yeni sorumluluk ekledik.
Odaya giren ve bize hayal kırıklığı ile bakan tek bir sorumluluk ilkesinden antropomorfik temsil. Kızgın değildi, ama daha iyi ve daha fazla hayal kırıklığına uğradığımızı biliyordu. Bu, bağımlılık olarak iki nesneyi kullanan Twitterfeed sınıfının yeni bir sürümüdür. twitterAccount = $ TwitterAccount;
$ this-> twitterapi = $ twitterapi;
}
} Bağımlılık enjeksiyonunu kullanarak, bu nesnede çok fazla problem çözdük. Ancak bu aslında kullanımı giderek zor. Belki de en iyisi Twitterapi sınıfından sadece bir örnek almaktır, bu nedenle küresel olarak erişilebilen bu sınıf örneklerinden birini isteyeceğiz.
Öte yandan, birçok hesaba sahip olmak istemeliyiz. Eklentimizi sadece 1 hesapla başlatsak bile, bazı hesapların olasılığını tasarlamak iyi bir uzun vadeli çözümdür. Ancak, hesap başına TwitterAccount’a pek çok örnek istemiyoruz. Kaynaklar açısından savurgandır ve hangi örnekleri güncellediğimizi asla bilemeyeceğimiz için eklentinin beklenmedik bir şekilde çalışmasını sağlayacaktır. Konteyner çevresindeki düzenleme, temel bir eklenti kabı oluşturarak ve ona bir Twitterapi örneği ekleyerek başlayalım. Yukarıda açıklanan iki senaryoda, buna küresel olarak erişilmeli ve bu nedenle konteynerimiz için tek bir desen uygulanması sorunu çözebilir. Bu ideal değil, ama basit, bu yüzden önce deseni anlamak için yapalım. İşte bir örneği uygulamak için tek bir desen kullanan ve daha sonra bu örnekte diğer nesneleri saklamak için bir depo deseni uygulayan sınıf. Eklenen ilk nesne, Gettwitterapi yöntemi aracılığıyla Twitterapi’dir. Tembel yüklü bir anlığın yalnızca gerektiğinde ve yalnızca bir kez yapıldığını unutmayın. nesneler [__method__])))) {
$ this-> nesneler [__method__] = yeni twitterapi ();}
$ This-> nesneler [__method__] döndür;
}
} Artık Twitterapi’ye Singleton’u uygulamak zorunda kalmadan küresel olarak erişilebilen bir Twitterapi sınıfı örneğimiz var. Artık yapay Twitter AAPI sınıflarını kullanan testler yazabilir veya daha sonra gerekirse yeni örnekler oluşturabiliriz.
Konteynerdeki fabrika Son bölümde, Twitterapi sınıfından bir örnek konteynerden almak için bir yöntem ekledik. Bir sonraki adımımız, birkaç TwitterCount sınıf örneğinin kullanılmasına izin vermektir, ancak hesap başına yalnızca bir tane. Bunu kapta uygulayabilmemiz için TwitterAccount nesneleri için bir fabrikaya ihtiyacımız var. Bu fabrikadan ayrı bir sorun. İlk olarak, kullanıcı adını bağımlılık olarak kabul etmek için TwitterAccount nesnesini yeniden düzenleyelim. Bu her benzersiz nesneyi yapar. kullanışlı ad = $ kullanıcı adı;
}
} Şimdi mümkünse veritabanından alan bu nesneleri oluşturmak için bir fabrika oluşturabiliriz. Bu fabrikada API seçeneğini basitlik için doğru veritabanı soyutlamasının yerine kullanıyorum.
TwitterCountFactory Sınıfı
{
/**
* Depolanan verilerden bir TwitterAccount örneği oluşturun
*
* @param String $ Name
*
* @Return Twitter hesabı
*/
Genel Statik İşlev Alın (String $ kullanıcı adı): TwitterCount
{
$ saRed = get_option (‘_prefixAccount’. $ kullanıcı adı);
İf ($ kaydedildi) {
Geri $ depolandı;
}
Yeni TwitterCount’u ($ kullanıcı adı) döndür;
}
} Bu fabrikanın bir depo deseni uygulamadığını unutmayın. Bir tane eklemek çok cazip, ama bu sınıf işi değil. Bunu yalnızca nesne yapmak için bırakmak, ana kapsayıcıyı depo olarak kullanabileceğimiz veya ayrı bir depo yapabileceğimiz anlamına gelir. İlk seçeneği yapalım çünkü daha basit. <? Php
Konteyner Sınıfı {
/** @var kap*/
$ korumalı statik örnek;
/**
* İzlenen nesneler içerir
*
* @var dizisi
*/
korumalı $ nesne;
Korumalı işlev __Construct () {}
/**
* Konteyner örnekleri alın
*
* @return kapsayıcısı
*/
Public Belance () ‘nin statik işlevi: konteyner
{
İf (! Static :: $ örnek) {
statik :: $ örnek = new static ();
}
geri statik :: $ örnek;
}
/**
* Twitter müşterilerini alın
*
* @return twitterapi
*/
Gettwitterapi’nin () genel işlevi: Twitterapi
{
if (! isset ($ this-> nesneler [__method__])))) {
$ this-> nesneler [__method__] = yeni TwitterApi ();
}
$ This-> nesneler [__method__] döndür;
}
/**
* Kullanıcı adıyla bir Twitter hesabı alın
*
* @param String $ Name
*
* @Return Twitter hesabı
*/
GettwitterAccount’un genel işlevi (String $ kullanıcı adı): TwitterAccount
{
$ arraykey = md5 (__Method__. $ kullanıcı adı);
if (! isset ($ this-> nesneler [$ arraykey]))) {
$ this-> nesneler [$ arraykey] = twitterAccountFactory :: get ($ kullanıcı adı);
}
$ this-> objects [$ arraykey];
}
} GettwittecCount () kapsayıcısındaki yeni yöntem önce bu hesabın nesnesinin Container nesne deposunda olup olmadığını kontrol eder. Değilse, yeni bir tane yapmak ve depoya eklemek için TwitterAccountFactory sınıfını kullanır.
Şimdi her şeyi bir araya getirerek, konteynerimiz Twitter nesneleri ve “ana örnek” sağlayabilir Twitter Topy sınıfından, TwitterFeed sınıfına bağımlılık sağlamak için kaplarımızı kullanan TwitterCounts için bir fabrika oluşturabiliriz. getTwitteccount ($ kullanıcı adı),
Container :: Gentace ()-> Gettwitterapi ()
);
}
} Artık bir API istemcisi oluşturmak zorunda kalmadan kullanıcı adlarına dayalı TwitterFeed nesneleri oluşturmanın kolay bir yolumuz var veya hesap ayrıntılarını Twitterfeed’e saklamak için hesap mantığı veya veritabanı etkileşimi.
Görev kısmen elde edilir. Bu neden TwitterAccount ve Twitterapi’de tek kullanımdan kaçınarak optimalden daha azdır, kullanımı ve test birimleri yazmak daha kolaydır. Ancak, tüm eklenti artık bu konteyner örneğine çok bağlı. Bekarın ana zayıflığı, durumlarını dinleyememenizdir, bu da her test arasında yapmanız gereken bir şeydir. Buna ek olarak, eklenti başına sadece bir kap bulunabilir ve sınıfı diğer eklentilerde doğru şekilde yeniden kullanamayabiliriz. Öyleyse, konteyneri Sington’a bağlı olmayacak şekilde yeniden düzenleyelim, ancak yine de küresel olarak erişilebilir. Kolaydır, yalnızca örnek özelliğini ve Bterinstance yöntemini sileriz ve yapıcıyı herkese açık hale getiririz. Depo makalemde gösterdiğim gibi konteyner için daha yaygın bir depo kullanmak veya sivilce gibi varsayılan bir kap kullanmak isteyebiliriz. Bir sonraki makalemdeki son seçeneği göstereceğim. Şimdilik, başından beri inşa edelim. Bu, tek bir desen olmadan kaptır. Şimdi, her birim testi için bu kaptan yeni örnekler oluşturabilir ve birkaç kap yapabiliriz. Bununla birlikte, tek bir modelin kaybı ile, bu kaptan örnekler almanın bir yolu yoktur, bu bir sorundur. Öyleyse örneği izlemek için bir işlev yapalım. <? Php/**
* Konteynerlerden ana örneği alın
*
* @return kapsayıcısı
*/
konteyner işlevi (): kapsayıcı
{
$ statik konteyner;
İf (! $ Container) {
$ Container = yeni kap;
}
geri $ konteyner;