Как маскировать дочерние классы в родительском классе с помощью автозагрузки (php) - PullRequest
0 голосов
/ 21 сентября 2010

У меня есть базовый класс, который наследуется примерно десятью подклассами.Большинство этих подклассов имеют очень похожее поведение, но я хочу определить специализированные методы только для трех из них.

Можно ли маскировать существование этих классов, автоматически загружая родительский класс каждый раз, когда объектдочерний класс создается?Таким образом, мне не нужно определять несколько классов с одним и тем же кодом?

Например

class ParentClass {
    public function __construct() {
        switch(get_class($this)) {
            case "ChildClass1" : do_stuff() break;
            case "ChildClass2" : do_other_stuff() break;
            default: break;
        }
    }
}

$c1 = new ChildClass1();
$c2 = new ChildClass2();

... и иметь только один файл ParentClass.php (без отдельных файлов ChildClass1.phpChildClass2.php).

Ответы [ 3 ]

2 голосов
/ 21 сентября 2010

Почему бы тебе просто не сделать это?

class ParentClass {
  public function __construct()
  {
    $this->do_stuff();
  }
}

class SpecializedClass
  extends ParentClass
{
  public function __construct()
  {
    // Optional, do the stuff parent does (do_stuff());
    parent::__construct();
    // ... specialized construction logic here
    $this->do_other_stuff();
  }

  // ... specialized methods here.
}

class NormalClass1
  extends ParentClass
{

}

class SpecialClass1
  extends SpecializedClass
{

}

// ... etc.
0 голосов
/ 21 сентября 2010

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

Это не обязательно верно для языков, отличных от PHP, которые имеют лучшую семантику импорта.

0 голосов
/ 21 сентября 2010

Вы должны добавить логику к функции __autoload() или spl_autoload_register(), которая при сравнении строк решает, какой файл загрузить / если он, возможно, является одним из дочерних элементов вашего родителя.

...