2015-02-12 9 views
0

Отказ от ответственности: я немного нуб, я занимаюсь только PHP менее года, а для OO PHP меньше.PHP-классы - шаблонный или наследуемый?

Я пишу несколько классов, все из которых имеют одни и те же функциональные возможности. Вот мой шаблонный код для него:

class ClassName { 

    // required constructor arguments 
    private $arg1; 

    // optional arguments in an array. $options array specifies their names 
    // and required types. '' means any type. 
    private $options = array('option1'=>'type', 'option2'=>''); 
    private $option1 = 'default_value'; 
    private $option2 = 'default_value'; 

    /* getters and setters would go here if I wanted them */ 

    // this would probably change after debugging 
    public function __toString() { 
     return print_r(get_object_vars($this), true); 
    } 

    public function __construct($arg1, array $options = array()) { 
     // set all required args 
     $this->arg1 = $arg1; 
     // cycle through $options array, check they are allowed, 
     // and check their type 
     foreach ($options as $option => $value) { 
     $type = $this->options[$option]; // no value = any type is OK 
     if (array_key_exists($option, $this->options) 
       && (gettype($value) === $type || !$type)) { 
      $this->$option = $value; 
     } 
     } 
    } 

    // methods go here 
} 

Я использую этот формат последовательно: требуемые параметры и затем факультативные в массив, присваивая все дополнительные переменные с петлей Еогеасп, с указанием параметров и их типы (основной различие, о котором я забочусь, это массив против не-массива) в качестве частной переменной.

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

abstract class ParentClass { 

    public function __toString() { 
     return print_r(get_object_vars($this), true); 
    } 

    protected function setOptions($options) { 
     foreach ($options as $option => $value) { 
     $type = $this->options[$option]; // no value = any type is OK 
     if (array_key_exists($option, $this->options) 
       && (gettype($value) === $type || !$type)) { 
      $this->$option = $value; 
     } 
     } 
    } 
} 

class ChildClass extends ParentClass{ 

    private $arg1; 
    private $arg2; 
    private $options = array('option1'=>'string', 'option2'=>'array'); 
    private $option1 = 'default_value'; 
    private $option2 = array('foo', 'bar'); 

    public function __construct($arg1, $arg2, $options = array()) { 
     $this->arg1 = $arg1; 
     $this->arg2 = $arg2; 

     parent::setOptions($options); 

    } 
} 

Я не сделал много с наследованием еще. Хорошо ли это?

Спасибо!

ответ

2

Это было бы полезно использовать наследование, и это всегда Лучшая практика по сокращению дублирования кода. DRY код гораздо менее громоздко модифицируется в будущем при изменении потребностей или возникают ошибки.

Редактировать: Кстати, вы могли бы поместить всю конструктивную логику в конструктор родительского класса, а затем переопределить ее в дочернем классе и вызвать родительский конструктор, когда закончите с логикой класса. Например:

abstract class ParentClass { 
    public function __construct($options) { 
     foreach ($options as $option => $value) { 
     $type = $this->options[$option]; // no value = any type is OK 
     if (array_key_exists($option, $this->options) 
     && (gettype($value) === $type || !$type)) { 
      $this->$option = $value; 
     } 
     } 
    } 
    public function __toString() { 
     return print_r(get_object_vars($this), true); 
    } 
} 

class ChildClass extends ParentClass{ 
    private $arg1; 
    private $arg2; 
    private $options = array('option1'=>'string', 'option2'=>'array'); 
    private $option1 = 'default_value'; 
    private $option2 = array('foo', 'bar'); 

    public function __construct($arg1, $arg2, $options = array()) { 
     $this->arg1 = $arg1; 
     $this->arg2 = $arg2; 

     parent::__construct($options); 
    } 
} 
+0

Ах да. На самом деле, моя IDE жалуется на меня, если я * не * вызываю родительский конструктор. – tangopianist