Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

[PHP][MVC] Singleton ve DI


nameless

Öne çıkan mesajlar

selams gençler,

aklımdaki bir fikri hayata geçirmeye çalışıyorum. yapacağım site için ilk başta codeigniter framework'unu kullanıyordum ama kullanıcı anlaşması canımı sıktığı için ben de sıfırdan bir şeyler yazmaya karar verdim. Şu anda router ve security sınıfları dışında her şeyi tamamladım. merak ettiğim bir soru var; bir çok cs'ci ve bu konuda sağlam kişiler olduğunu biliyorum forumda.

maruzat starts:

yeni controller'ler ana controller sınıfından inherit ediliyor ve ana controller sınıfı singleton şablonunu kullanıyor. ana nesne o sırada çağrılan controller sınıfının nesnesi.

ana ve örnek controller'ler şu şekilde (biliyorum codeigniter'e benziyor ama olur o kadar)


<?php

class Controller {

private static $instance;
var $load;

function __construct()
{
self::$instance =& $this;
$this->load =& loadClass('Loader', 'engine');
}

public static function &getInstance()
{
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}



<?php

class Home extends Controller {

function __construct()
{
parent::__construct();
}

function show()
{
$this->load->view('home_view');
}
}


dependecy injection kullanmak daha mı mantıklı olur yoksa böyle mi devam etmeliyim? bir sürü şey okudum ama kararsız kaldım.

edit:

ayrıca, anonim değişken kullanmak ne kadar sağlıklı performans açısından?
Link to comment
Sosyal ağlarda paylaş

singleton patternda constructorda private olur genelde, publicte bi cesit get metodu yaparak static Controller* instance'yi alirsin.

burda constructor private mi public mi onu anlayamadim syntaxi bilmedigim icin, private ise sorun yok zaten. Zamaninda benimde yaptigim bi hataydi o yuzden bi hatirlatayim dedim.

Onun disinda konu hakkinda bilgim yok :)
Link to comment
Sosyal ağlarda paylaş

private constructor :W

şu anda kara kara düşünüyorum. dün öğlen beş gibi başlayıp bugün 12'de arada 8 saat uyuyarak bitirdim, zaman sorun olmaz değişiklik için. ana bir container sınıfı oluşturup öyle mi yapsam diye düşünüyorum, ana controller oradan inherit edecek vs gibi.
Link to comment
Sosyal ağlarda paylaş

DI 'yi burda neyin yerine kullanicaksin o tam anlasilmiyor.

Singleton base class'in yerine mi? yoksa inherit etmek yerine bu base class'i DI ile Home'a gecirmek mi dusundugun sey?

DI daha cok nesneleri birbirinden bagimsizlistirmayi saglayan ve bunu icin framework bile yazilabilinicek birsey. bence bu kod icin (madem controller ve Home birbirine oldukca bagli) factory pattern kullanabilirsin ve gayetde basit, anlasilir olur.
bu factory pattern'de singleton controller objesini dondurebilir eger gerekliyse.
Link to comment
Sosyal ağlarda paylaş

nameless said:

anonim değişkenle demek istediğim şu: sınıfta var olmayan bir değişkeni $this->$class = new $class() diyerek o anda istediğimiz sınıfı ismiyle ekleyebiliyoruz. bunun performansa etkisi nasıldır?


php'yi bilmem ama su soz bence aklinin bi kosesinde hep kalsin;

'premature optimization is the root of all evil' - Donald Knuth.
Link to comment
Sosyal ağlarda paylaş

Anason said:

DI 'yi burda neyin yerine kullanicaksin o tam anlasilmiyor.

Singleton base class'in yerine mi? yoksa inherit etmek yerine bu base class'i DI ile Home'a gecirmek mi dusundugun sey?


yeni çağırılan sınıfları ana sınıfa eklemek için düşünmüştüm. mantıksız mı düşüncem. yine singleton base class duracak ama ondan türettiğim controller sınıftan ana nesne üretildiğinde çağırılan diğer sınıflar bu ana nesneye inject edilecek.
Link to comment
Sosyal ağlarda paylaş

Hmm anladim, benim dusundugumun tam tersini dusunmussun. yapmak istedigin icin DI yi kullanmaya gerek yok, nasilsa base class'inda static degiskenler var. o static degiskenlerde her turettigin siniflari (derived classlari) oraya ekleyebilirsin.
DI daha cok classlar arasi bagimliligi ayirarak gerekli methodlari yada siniflara karar veren ve bunlari baska siniflara gondermek icin var.
mesela Home, controllerdan turemeseydi, DI sayesinde sen Home'a controller'i constructor parametresi olarak gonderebilirdin gibi.

nameless said:

Anason said:

DI 'yi burda neyin yerine kullanicaksin o tam anlasilmiyor.

Singleton base class'in yerine mi? yoksa inherit etmek yerine bu base class'i DI ile Home'a gecirmek mi dusundugun sey?


yeni çağırılan sınıfları ana sınıfa eklemek için düşünmüştüm. mantıksız mı düşüncem. yine singleton base class duracak ama ondan türettiğim controller sınıftan ana nesne üretildiğinde çağırılan diğer sınıflar bu ana nesneye inject edilecek.
Link to comment
Sosyal ağlarda paylaş

evet aynen oyle. boylelikle home ve controller arasindaki iliskiyide gozden gecirebilirsin. mesela home bir controllermidir (is-a iliskisi) yada controller'a sahip bir nesnemidir (has-a iliskisi).

nameless said:

teşekkür ederim anladım dediğini. o zaman controller'dan inherit olmayanları inject edebilirim constructor veya setter fonksiyonlar ile?
Link to comment
Sosyal ağlarda paylaş

  • 2 hafta sonra ...
wrapper bir sınıf yaptım; sadece tek instance var oluyor ve controller ile model'a constructor ile inject ediliyor. şöyle bir şey yapabilirim: controller'i olaydan çıkarıp sadece model-view olarak da daha micro formata indirebilirim. model'in bazı fonksiyonları veriye erişir, diğer fonksiyonları (view'ları çağıran vs) controller gibi işler. iyi bir yaklaşım olur mu bu?
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...