关于PHP OOP代码的建议

关于PHP OOP代码的建议,php,oop,Php,Oop,在PHP项目中,我有三层(逻辑层) UI: 用于存储UI php页面的位置。例如:ManageUsers.php 代码: 与系统相关的所有实体类。例如:User.php 数据访问: 实体类的数据访问类,例如:UserDataAccess.php 因此,为了从UI添加用户,我创建了user类的一个实例来设置它的属性&调用AddUser方法(在user类中)。在AddUser方法中,它创建一个UserDataAccess类的实例,并将相同的($this)对象传递给UserDataAccessInse

在PHP项目中,我有三层(逻辑层)

UI

用于存储UI php页面的位置。例如:
ManageUsers.php

代码

与系统相关的所有实体类。例如:
User.php

数据访问

实体类的数据访问类,例如:
UserDataAccess.php

因此,为了从UI添加用户,我创建了user类的一个实例来设置它的属性&调用
AddUser
方法(在user类中)。在
AddUser
方法中,它创建一个UserDataAccess类的实例,并将相同的($this)对象传递给UserDataAccess
Insert
函数。它从用户对象属性获取数据并更新表。(通过代码层将状态返回到UI

我对其他功能(如编辑和删除)重复此操作

  • 这是实现这种CRUD功能的更好的OOP方法,还是我可以减少一层&将代码数据访问层结合起来,使其更简单
  • 是否可以在ManageUser页面中多次实例化User类(一个实例用于添加,一个实例用于编辑等),还是应该只为单个页面实例化一次
  • 对不起,问题太长太复杂了。。提前感谢…

    这是实现CRUD功能的更好的OOP方法,还是我可以减少一层并结合代码和数据访问层使其更简单

    建议使用三层方法(接口“U.I.”、业务逻辑“代码”和数据访问)

    你会发现有几种商业应用程序。使用您建议的“2层”方法。如果您认为应用程序将“增长”,则应使用3层

    但是,请记住,其复杂性也将增加

    您可能还希望获得(下载、开发、购买)一个单独的工具程序来读取数据库或数据访问,并从中生成实体类,而不是自己编程

    如果可能,对“代码”或“业务逻辑”实体执行相同的操作

    还有一件事,避免将所有实体放在一个文件中

    而是为每个实体使用一个文件。至少为您的界面或“边界”类创建一个“GUI”文件夹, “代码”类文件夹和“数据访问”类文件夹

    您的网站或应用程序可能很小,而且这些建议可能非常复杂,不必要

    但是,从经验来看,这些应用程序。倾向于增长,甚至“宠物”或“个人”网站,出乎意料地可能会增长,并变得复杂

    即使是个人的小项目,你也可以尝试使用这些建议,为大型网站或应用做好准备

    附加建议

    我从一位同事那里学到的一个技巧是,为了使代码更易于维护,它使用一个程序自动生成实体代码,以后不再像通常在3层方法中那样生成这些类实体的实例

    相反,第二类实体是代码,通常是手动添加一些成员或特性,这些成员或特性可能会定期更新

    因此,第一个(父)类具有可以从数据库(或XML文件)获取的成员,第二个(子)类具有可能无法从数据库获取的成员,并且还需要进行大量更改,这些更改需要“手工编码”

    示例:

    (1) 您的数据库表(或XML文件或本地文件)如下所示:

    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,谢谢您的评论,看起来这个设计还可以。