gpt4 book ai didi

php - 组织类(class) - 帮助 OOP 初学者

转载 作者:可可西里 更新时间:2023-11-01 00:10:43 24 4
gpt4 key购买 nike

我读到的关于类结构的示例通常从一个基类开始,然后该基类通过更细化的类进行扩展,即。经常被引用的:

class Animal {}
class Rodent extends Animal {}
class Mouse extends Rodent {}

但在我的 CMS/电子商务系统的现实世界项目中,我似乎正在以相反的方式构建这种结构,即从一种情况的类开始,然后用与整个项目相关但实际上与整个项目相关的东西扩展它扩展类。

class page {}
class product extends page{}
class category extends product{}
class basket extends category{}
class shop extends basket{}

因此,通过这种方式,我只需调用 $s = new shop() 并访问运行该商店所需的所有类/方法。我想我只是扩展类以保存分别实例化每个类。这似乎与我读过的大多数示例背道而驰,而且我肯定错过了 OOP 在这里的全部内容。随着类(class)的扩展,我的类(class)似乎变得越来越普遍,越来越不专业。

我应该继续这种方式还是重新构建我构建这个类系统的方式?

最佳答案

您可以在谷歌上搜索组合优于继承is-a vs 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包含数据库连接

关于php - 组织类(class) - 帮助 OOP 初学者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7481870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com