关于PHP OOP代码的建议
在PHP项目中,我有三层(逻辑层) UI: 用于存储UI php页面的位置。例如:关于PHP OOP代码的建议,php,oop,Php,Oop,在PHP项目中,我有三层(逻辑层) UI: 用于存储UI php页面的位置。例如:ManageUsers.php 代码: 与系统相关的所有实体类。例如:User.php 数据访问: 实体类的数据访问类,例如:UserDataAccess.php 因此,为了从UI添加用户,我创建了user类的一个实例来设置它的属性&调用AddUser方法(在user类中)。在AddUser方法中,它创建一个UserDataAccess类的实例,并将相同的($this)对象传递给UserDataAccessInse
ManageUsers.php
代码:
与系统相关的所有实体类。例如:User.php
数据访问:
实体类的数据访问类,例如:UserDataAccess.php
因此,为了从UI添加用户,我创建了user类的一个实例来设置它的属性&调用AddUser
方法(在user类中)。在AddUser
方法中,它创建一个UserDataAccess类的实例,并将相同的($this)对象传递给UserDataAccessInsert
函数。它从用户对象属性获取数据并更新表。(通过代码层将状态返回到UI)
我对其他功能(如编辑和删除)重复此操作
CREATE TABLE User
(
integer UserKey primary key,
varchar(20) UserAlias,
varchar(250) UserPasword,
integer UserIsActive, -- My D.B. doesn't support boolean
)
(2) 您可以手动或通过工具生成这样的数据访问层实体:
abstract class FieldsUserDataAccessEntityClass
{
/* integer */ protected $fieldUserKey = 0;
/* string */ protected $fieldUserAlias = "";
/* string */ protected $fieldUserPassword = "";
/* integer */ protected $fieldUserIsActive = 0;
/* integer */ public function CalculateNewKey();
/* void */ public function Insert();
/* void */ public function InsertWithKey(/* integer */ $newKey);
/* void */ public function Update();
/* void */ public function Delete();
} // class
abstract class FieldsUserLogicAccessEntityClass
{
/* integer */ protected $fieldUserKey = 0;
/* string */ protected $fieldUserAlias = "";
/* string */ protected $fieldUserPassword = "";
/* integer */ protected $fieldUserIsActive = 0;
/* void */ public function DoSomeThing();
} // class
前一个类通常直接使用(没有“抽象”特性)
但是,建议是,在其他文件中,(我跳过方法代码):
我使用将“IsActive”字段从“integer”转换为“boolean”作为示例,
可能是其他东西,比如截断太长的字符串
一些开发人员会抱怨,并建议在业务逻辑实体中这样做
(3) 您可以手动或通过工具生成如下业务逻辑层实体:
abstract class FieldsUserDataAccessEntityClass
{
/* integer */ protected $fieldUserKey = 0;
/* string */ protected $fieldUserAlias = "";
/* string */ protected $fieldUserPassword = "";
/* integer */ protected $fieldUserIsActive = 0;
/* integer */ public function CalculateNewKey();
/* void */ public function Insert();
/* void */ public function InsertWithKey(/* integer */ $newKey);
/* void */ public function Update();
/* void */ public function Delete();
} // class
abstract class FieldsUserLogicAccessEntityClass
{
/* integer */ protected $fieldUserKey = 0;
/* string */ protected $fieldUserAlias = "";
/* string */ protected $fieldUserPassword = "";
/* integer */ protected $fieldUserIsActive = 0;
/* void */ public function DoSomeThing();
} // class
在另一个文件中,(我跳过方法代码):
当您必须在数据库中添加、删除或更新字段时,这些方法非常有用,但是,它更复杂,因此需要一个实体生成器
其思想是工具生成“带字段的抽象”实体类,
如果需要,您可以手动修改“具体子”实体类
在现实编程中,手动修改hte实体的情况经常发生
可以在ManageUser页面中多次实例化用户类(一个实例用于添加,一个实例用于编辑等),还是应该在单个页面中仅实例化一次
可以多次实例化一个实体类,但更常见的是,将它们作为临时对象int方法。对于像“当前登录的用户”这样的对象,您可以使用“单例”对象。为什么不从
UserDataAccess
扩展user
?允许您保持专用代码的独立性(很好!),但似乎仍然减少了应用程序的一层。祝贺您,您发现了MVC(模型、视图、控制器)模式!建议将三个部分彼此分开。@nikc.org,因为通常需要将数据访问层与相应的值对象分开。否则,如果不同时更改用户
,您将无法扩展或更改(此处)UserDataAccess
。@cillosis,谢谢您的评论,看起来这个设计还可以。