2010-09-20 1 views
0

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

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

E.g.

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.php или ChildClass2.php).

+0

Не копируйте свой код, чтобы сохранить создание нескольких файлов. Если вы поместите общую реализацию в «ParentClass» и только переопределите, где это необходимо, в дочерних классах, файлы «ChildClass1.php» и «ChildClass2.php» не будут иметь дублированный код. – grossvogel

ответ

2

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

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

Как моя среда находит эти классы? Моя текущая настройка автоматически загружает класс, если он находится в отдельном файле, но он не может загрузить класс, если он определен в файле другого класса. – Cat

+0

А я понимаю, что вы здесь просите. На мой взгляд, полагаться на функциональность __autoload - отличный способ получить запутанную кодовую базу очень быстро. Вы должны группировать связанные классы в файлы и требовать их там, где это необходимо вручную. Использование require_once велико, потому что если у вас есть циклические зависимости или сложная цепочка зависимостей, вы не будете включать один и тот же набор классов более одного раза. –

0

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^