oop — классы PHP — шаблон или наследование?

Отказ от ответственности: я немного новичок, я занимаюсь PHP меньше года и делаю OO 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, указание параметров и их типов (главное отличие, которое меня волнует, — массив против не массив) как приватная переменная

Цикл 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);

}
}

Я еще не много сделал с наследованием. Это хорошее применение?

Спасибо!

0

Решение

Это было бы хорошим использованием наследования, и это всегда Лучшая практика для уменьшения дублирования кода. 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);
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector