Ken*_*lik 1 php database oop inheritance
PHP和OOP的新手所以请耐心等待......在设计和编写我的第一个PHP和OOP网站之后,我已经处于乐观的早期阶段,经过一生的写作糟糕的M $ VBA垃圾.
我有一个类"User",它有一个带有相关数据库调用的save方法等...(实际上我有DB和DBUtils类来处理连接和CRUD - 我的业务类只调用DB Utils上的select,update,delete方法并传递数据的关联数组)
Anywho ...我的"用户"类由"Admin"类扩展,除了"User"yada yada之外还有一些额外的属性......
在"管理员"中处理保存方法的最佳方法是什么?我知道如果我向Admin类添加一个save方法,它将取代User上的那个,但我不希望它.我想在Admin上编写save方法,只处理特定于Admin对象的属性等,以及继承自"User"的属性,以便在User save方法中处理.
那有意义吗?它是我正在寻找的特定OOP模式吗?任何有关如何设计和构造此代码的帮助或指导将不胜感激.
编辑:哇!感谢下面的所有答案.不确定哪个是我的首选.我将不得不做一些游戏......
你的主要问题源于你忽略了OOP中的一个核心思想:单一责任原则 ...... 然而,似乎每个提供"答案"的人都不知道SRP是什么.
您所谓的"业务逻辑"应与存储相关的操作分开.Userno 的实例都不Admin应该知道存储是如何执行的,因为它不是业务逻辑.
$entity = new Admin;
$mapper = new AdminMapper( $db );
$entity->setName('Wintermute');
$mapper->fetch( $entity );
//retrieve data for admin with that name
$entity->setName('Neuromancer');
$mapper->store( $entity );
// rename and save
Run Code Online (Sandbox Code Playgroud)
您在上面看到的是数据映射器模式的极其简化的应用.此模式的目标是分离业务和存储逻辑.
如果不是直接实例化映射器$mapper = new AdminMapper( $db ),而是由注入的工厂提供$mapper = $this->mapperFactory->build('Admin')(因为它应该在适当的代码库中),您将没有关于存储介质的指示.数据可以存储在SQL DB或文件或某些远程REST API中.如果映射器的接口保持不变,则可以在需要时替换它.
使用工厂可以避免与特定类名紧密耦合,如果是SQL数据库的映射器,可以在每个实例中注入相同的数据库连接.
但是,如果您正在认真考虑学习OOP,那么阅读本书是必须的.