PHP5 Sınıflar - Bir arama sınıfın değişkenleri alabilir miyim?

5 Cevap php

Tamam, ben OO yeni ve PHP5 hala yeni değilim.

Ben $ db adlı DB, bir örneğini oluşturur bir sınıf Sayfası var.

Page __ yapı () olarak, ben yeni $ db nesnesi oluşturmak ve ben bir dosyadan yapılandırma veri bir demet çekin.

Şimdi DB sınıf veritabanına bağlanmak için bir yöntem _connectToDB () (deneme) sahiptir.

Ana sınıfının config dizi aramak için DB sınıfında bir yolu var mı? Ben gerek yok ve ben iki kez yapılandırma veri kapmak istemiyorsanız ben global değişkenler yapmak istemiyorum.

Sözde kod şöyle bir şey olabilir

$dbUsername = get_calling_class_vars(configArray['dbUserName']);

Teşekkür ederim

5 Cevap

Ben onlar ne gerekiyorsa değişkenler yakın tüm "önemli" nesneleri başlatmak için genellikle daha kolay olduğunu bulmak. Bunu bu şekilde deneyebilirsiniz:

/* Code to get config variables here */
$DB = new DB($config);
/* You might want to delete the database password from $config here */
$Page = new Page($config, $DB);

Bunu bu şekilde yapıyor ayrıca tip-kontrol veritabanı nesnesi üzerinde istediğiniz yapabilirim eğer gelir:

class Page {
    function __construct(array $config, DBClass $db) { }
}

Neden connectToDb işlevine yapılandırma parametreleri geçirmek veya DB sınıfının kurucusuna yapılandırma veri geçemiyor.

Ve dizinin soruya cevap: Eğer geçerli bağlamda dış arama kapsamı hakkında hiçbir şey bilmiyorum.

debug_backtrace() sınıfları veya nesneleri arayarak hakkında bilgi almak için bkz.

Sonra Reflection, belirli bir sınıf veya nesnenin özellikleri hakkında daha fazla bilgi almak için bkz.

edit: Ama bu değer ne için, ben de size gereken belirli parametreleri geçen öneriyoruz. Arayanın verileri başvuruda muhtemelen Content Coupling oluşturmaktadır.

Sen çocuğa üst başvuru iletebilirsiniz. Örneğin:

class Parent {
  function __construct() {
    $this->myChild = new Child($this);
  }
  public function doSomething() {}
}

class Child {
  function __construct(Parent $parent) {
    $parent->doSomething()
  }
}

Eğer ebeveynin kurucusunu hala konum beri, bu garip bulabilir ve böylece üst nesne tam olarak henüz inşa edilmiştir. Ama hala bile yapıcı, kendinize bir referans olarak $ kullanabilirsiniz. Sadece çocuğunuz henüz başlatılmamış olan ebeveynde şeyler ifade etmez ki dikkatli olmak gerekir.

Genel olarak bunu yapmak için kolay bir yolu yoktur. ama genel bir tasarım sorunu olarak ben neden önlemek global değişkenleri görebilirsiniz, ancak uygulama geniş yapılandırma durumunda o özelliklerine küresel erişim için mükemmel makul olduğunu.

Eğer yapılandırma veri küresel yapmak ya da sadece db nesnesi başlatma için gerekli özellikleri geçirmek ya.