Обработка зависимости порядка в циклах - PullRequest
2 голосов
/ 15 мая 2010

Я создаю систему шаблонов, в которой я создаю каждый тег с помощью цикла foreach. Проблема в том, что некоторые теги зависят друг от друга, поэтому мне интересно, как обойти этот порядок из цикла.

Вот пример:

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!

РЕДАКТИРОВАТЬ: Хорошо, просто чтобы уточнить .. Моя главная проблема заключается в том, что класс A опирается на класс B, но экземпляр класса A создается перед классом B , поэтому ширина еще не была определена в класс B. Я ищу хороший способ убедиться, что все классы загружены для всех, что позволяет существовать взаимозависимости. В будущем, пожалуйста, не учитывайте синтаксические ошибки. Я только что составил этот пример на месте. Также предположим, что у меня есть доступ к классу B из класса A после создания экземпляра класса B.

Я знаю, что это имеет применение в других местах, и я уверен, что это было решено раньше, если бы кто-то мог просветить меня или указать мне правильное направление, которое было бы здорово!

Спасибо! Мэтт Мюлер

Ответы [ 3 ]

1 голос
/ 18 мая 2010

Самый простой способ, вероятно, состоит в том, чтобы сделать второй проход по массиву объектов тегов после того, как все они были созданы, и вызвать некоторый стандартный метод (см. Шаблон шаблона шаблона, например, http://java.dzone.com/articles/design-patterns-template-method) для каждого, например,

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

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

Способ реализации resolDependencies зависит от класса.

1 голос
/ 04 июня 2010

Откуда берется этот экземпляр $ B в A :: construct ()? Это не там в объеме.

Возможные решения:
1) Статические значения:

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

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

2) Статические функции:

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

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

3) Как раз вовремя фабричный метод (или объект, если он вам нужен), если вам нужны объекты

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);
}

И если вы хотите, чтобы изменение в B отразилось на A, вы всегда можете использовать ссылки вместо назначений. Все это, конечно, предполагает наличие определения класса, определение __autoload (), если нет, или включение их всех заранее.

0 голосов
/ 15 мая 2010

Вам не хватает width() метода в B классе, который вы вызываете в A классе $this->width = $B->width(); (и вы должны включить или отсортировать наследование для использования класса B в классе A)

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

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

Что касается заказа, вы должны быть более конкретным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...