Отказ от ответственности: я немного нуб, я занимаюсь только 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);
}
}
Я не сделал много с наследованием еще. Хорошо ли это?
Спасибо!
Ах да. На самом деле, моя IDE жалуется на меня, если я * не * вызываю родительский конструктор. – tangopianist