Вы можете гуглить композицию через наследование и is-a против has-a .
В своем эскизе дизайна, как вы заметили, вы перепутали кучу вещей. Самый простой пример для анализа будет class category{} extends product
. Одна категория не является продуктом, но имеет / содержит несколько продуктов. Это было бы более подходящим:
class product {
public $title; // for simplicity
public $price; // for simplicity
}
class category {
private $name;
private $products;
public function __construct($name) {
$this->name = $name;
$this->products = array();
}
public function addProduct(product $p) {
$this->products[] = $p;
}
public function printProducts() {
$product_names = array_map(function($product) {
return $product->title;
}, $this->products);
echo implode(', ', $product_names);
}
}
$c = new category('fruits');
$apple = new product;
$apple->title = 'apple';
$orange = new product;
$orange->title = 'orange';
$banana = new product;
$banana->title = 'banana';
$c->addProduct($apple);
$c->addProduct($orange);
$c->addProduct($banana);
$c->printProducts();
Обратите внимание, как вы разделяете обе сущности и позвольте product
беспокоиться о том, что продукт может и что он может делать, а также о том, что категория (имя) имеет (продукты) и что может делать (распечатывает список своих продуктов).
Еще один совет для развязки (минимизации зависимостей между классами) заключается в том, что вы должны стараться как можно дольше хранить данные в ваших объектах. Классы в приведенном выше примере являются упрощенными, но функциональными. Если вы можете заставить их работать без доступа к базе данных (что является распространенной причиной наличия огромной цепочки extends
), вы поймете, что ни один из этих классов не нуждается в доступе к базе данных и что они могут быть заполнены / созданы классами, которые имеют доступ к базе данных. Примерно так:
class category_factory {
public function __construct(PDO $pdo) { $this->pdo = $pdo; }
public function getCategories() {
$rows = $this->pdo->query("SELECT * FROM categories")->fetchAll();
$categories = array();
foreach($rows as $row) {
$categories[] = new category($row['name']);
}
return $categories;
}
}
* PDO содержит соединение дБ