Döngüler sipariş bağımlılığını Kolu

3 Cevap php

Ben bir foreach döngü kullanarak her bir etiketi örneğini bir çiftleşmiş sistem yapıyorum. Konu etiketleri bazı yüzden, ben loop o sipariş almak nasıl merak ediyorum birbirlerine güvenmek olduğunu.

Here's an example:

Class A {
  public $width;
  __construct() {
     $this->width = $B->width; // Undefined! Or atleast not set yet..
  }

}

Class B {
  public $width;
  __construct() {
     $this->width = "500px";
  }
  __tostring() {
      return "Hello World!";
  }
}

Template.php

$tags = array("A", "B");
foreach ($tags as $tag) {
   $TagObj[$tag] = new $tag();
}

echo $TagObj['A']->width; // Nadamundo!

EDIT: Ok just to clarify.. My main problem is that Class A relies on Class B, but class A is instantiated before class B, bu nedenle genişliği henüz tüm sınıflar bağımlılık var sağlayan herkes için yüklendiğinden emin olmak için iyi bir yol arıyorum B sınıfı tanımlanmış değil. İlerisi için, bir sözdizimi hatası .. Ben sadece yerinde bu örneği uydurdum düşünmüyoruz lütfen. Ayrıca, B sınıfı örneği alır sonra ben sınıfı A sınıfı B erişim hakkına sahip olduğunu varsayalım.

Bu başka bir yerde uygulamaları olduğunu biliyorum ve birisi beni aydınlatmak ya da büyük olurdu bana doğru yönde işaret eğer ben, bu daha önce çözüldü eminim!

Thanks! Matt Mueler

3 Cevap

Kolay yolu muhtemelen hepsi örneği oldum bir kez etiketi nesnelerin dizi üzerinde ikinci bir geçiş yapma ve her örneğin bazı standart yöntemi (http://java.dzone.com/articles/design-patterns-template-method Kalıp yönteminin örneğin bakınız) arayarak olacak

$tags = array("A", "B");
foreach ($tags as $tag) {
   $TagObj[$tag] = new $tag();
}

foreach (array_keys($TagObj) as $tagName) {
   $TagObj[$tagName]->resolveDependencies($TagObj);
}

ResolveDependencies nasıl uygulanır sınıftan sınıfa değişir.

() Nereden geliyor A :: yapı bu $ B örneği nedir? Bu kapsamda orada değil.

Possible solitions:
1) Static values:

class B {
    static $width = '500px';
...

class A {
    function construct(){
        $this->width = B::$width;
     }

2) Statik fonksiyonlar:

class B {
    static function width(){
         return '500px';
...

class A {
    function construct(){
        $this->width = B::width();
     }

Nesneleri gerekirse 3) Just in time factorymethod (veya nesne) bir ihtiyacınız varsa

function getTag($name){
    global $TagObj;
    if(!isset($TagObj[$name]) && class_exists($name)){
         $TagObj[$name] = new $name();
    }
    return $TagObj[$name];
}

class A {
    function construct(){
        $this->width = getTag('B')->width();
     }
....
$tags = array("A", "B");
foreach ($tags as $tag) {
   $TagObj[$tag] = getTag($tag);
}

Eğer B bir değişiklik A yansıtmak istiyorsanız ve her zaman yerine atamaları başvuruları kullanabilirsiniz. Elbette tüm bu sınıf tanımı, mevcut değilse () bir __ autoload tanımlamak, veya önceden hepsini içerecek şekilde bekliyor.

Eğer A class $this->width = $B->width(); (ve devralma içeren veya tür kullanmalıyım içinde aradığınız B sınıfında width() yöntemi eksik A sınıfında B sınıfını kullanmak için)

Class B {
  private $width;
  __construct() {
     $this->width = "500px";
  }
  __tostring() {
      return "Hello World!";
  }

  function width() {
   return $this->width;
  }
}

Sipariş gelince, daha spesifik olmalıdır.