PHP OOP - 实现 2 个类的最佳方法

Posted

技术标签:

【中文标题】PHP OOP - 实现 2 个类的最佳方法【英文标题】:PHP OOP - best way to implement 2 classes 【发布时间】:2014-09-16 14:23:36 【问题描述】:

我有一个简单的数据库,其中包含用户数据表、控制器数据表和 user_controller 表,其中包含 controllerID 和 userId。

在我的 php OOP(第一次)实现中,我有一个 User 类和一个 Controller 类。

用户的功能很简单——他可以登录和注销并查看所有控制器的表格。 我有一个管理员用户,可以查看所有用户及其控制器,他可以向用户添加/删除/编辑控制器,也可以添加\删除\编辑用户。

实现了登录功能(DB 类、用户类和助手类)

我的问题是我应该如何以及在哪里构建向用户添加控制器的功能。 控制器有一个 id(唯一的)、一个名称(不是唯一的)和密码。

用户私有字段是:

private $_db,
        $_data, //all of this user data
        $_sessionName,
        $_cookieName,
        $_isLoggedIn;

和控制器类:

private $_db,
        $_data; //all of this controller data

我尝试在控制器中实现函数 Create:

public function create($fields = array())
        if(!$this->_db->insert('controllers',$fields))
            throw new Exception("Problem creating new controller");

和用户中的函数createController:

public function addController($pass,$controller_name,$lat='',$lon='')
    if ($pass && $controller_name)
        $controller = new Controller();

        $salt = Hash::salt(32);

        try
            $controller->create(array(
                    'pass' => Hash::make($pass,$salt),
                    'salt' => $salt,
                    'controller_name' => $controller_name,
                    'lat' => $lat,
                    'lon' => $lon
                    ));
        //if success then we update user-controller table
            $controller_id = $controller->find($controller_name)->data()->id;
            $userID = $this->data()->ID;
            $fields = array(
                'UserID' => $userID,
                'ControllerID' => $controller_id
                );

            if(!$this->_db->insert('user_controllers',$fields))
                throw new Exception("Problem creating controller for user");
            
        
        catch(Exception $e)
            throw new Exception('There was a problem creating new controller'); 
        
     else 
        throw new Exception('No name or password had been given');
    

通常它是有效的。但是有几个问题:

    控制器的 id 是由数据库自动创建的,所以我在创建时不知道它。我以后无法按名称找到控制器,因为我可以拥有很多具有此名称的控制器

    我不确定这是处理用户和控制器之间关系的正确方法

    我无法为用户实现“显示所有控制器”。

能否请您告诉我实现这种关系的正确方法是什么以及如何制作用户的createController和ShowControllers?

【问题讨论】:

我做过类似的事情,我创建了一个 UserTools 类来处理用户可以做的任何事情。也许你可以做类似的事情? 你可能想使用类似 last_insert_id() 的东西,或者如果你的 ORM 有类似的功能,来获取你刚刚创建的控制器的 id。 谢谢 Jestep,听起来很有趣...只是一个从特定表返回 max(ID) 的函数——我可以看到它是如何解决这个特定问题的 放大 - UserTools 假设处理 create\edit\delete 控制器的所有功能?什么类应该删除用户本身(来自管理员)?用户类还是用户工具? 【参考方案1】:

您的结构似乎是正确的。您需要一个用户表、一个控制器表和一个 user_controller 表,正如您所提到的,它们映射了两者之间的关系(用户有很多控制器)。

您的问题的解决方案:

    当您插入数据时,您需要检索插入的新记录的 ID 以用于您的映射关系。在您的示例中,我不确定您是自己编写此 MVC 结构还是其他方式;它看起来有点像 CodeIgniter。如果是 CI 应用程序,here's an example of how to get the last insert ID。如果是定制应用,可以使用$mysqli->insert_id (mysqli) 或$pdo->lastInsertId(); for PDO.

    你的做法是正确的。

    在用户场景的“显示所有控制器”中,您将查询 user_controller 表以获取所有控制器关系的列表,并且您将使用连接(内部可能适合,用于强制成功连接)。您指定要在您的选择字段中返回controller.*,您最终会得到每个控制器的记录并忽略用户控制器字段(如果您不需要它们)。示例 SQL 查询可能如下所示:

    选择控制器。* FROM user_controller UC
    INNER JOIN 控制器 ON controller.id = user_controller.controller_id
    WHERE user_controller.user_id = [YOUR_USER_ID_HERE]

【讨论】:

感谢您的解释。我知道如何查询表格。我只是确定哪个类应该处理这个功能。不 - 我不使用框架或 MVC 模式。现在我只有与它们一起使用的类和视图。稍后也许我会选择 MVC,但现在我只需要一个可行的解决方案 OK - 这行 $controller_id = $controller->find($controller_name)->data()->id; 根据(非唯一)名称获取控制器 ID 应替换为 $controller->insert_id$controller->lastInsertID(),具体取决于您使用的数据库驱动程序(可能需要提及这一点)并且如果您自己编写了 DB 类,则可能需要创建另一个包装器来调用这些属性/函数,除非该类已经引用了数据库连接。如果您可以提供您的 DB 类的示例,我可以进一步帮助您。 我正在使用 PDO 和 Mysql。我将按照您的建议实现一个函数: LastId($table,$field) - 这将返回某个表中的最大 id。所以这是一个解决方案 - 谢谢。剩下的问题是 - 我应该在哪里实现 show\create\edit\delete 控制器 - 在用户类或新类中? @alexandra 从 MySQL 返回 max(id) 在技术上是不正确的,您真的想使用 $pdo->lastInsertID() 返回您的查询插入的最后一个 ID,它是一个内置资源,很简单使用,会给你一个一致的结果。至于您的其他问题,RESTful 方法会告诉您将所有这些方法(显示、创建、编辑、删除)放入控制器类中。如果您的意思是删除用户和控制器之间的链接,请将它们放在用户类中,例如user/deleteController/CONTROLLERIDuser/controller/delete/CONTROLLERID @alexandra - 我还应该澄清最后一个插入的想法。您不需要将任何参数传递给您的函数。您应该使用您用于插入数据的现有 PDO 资源,该资源将在内部存储新 ID,并且该函数将简单地返回它。您的 DB 类应该将 DB 资源存储为内部属性,以便您可以在请求中一次又一次地访问它。

以上是关于PHP OOP - 实现 2 个类的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

PHP面向对象(OOP)编程入门教程4.如何抽象出一个类?

PHP/MySql - 使用嵌套对象查询对象的最佳方法

JS - OOP-继承的最佳实现方式

制作 PDO mysql 静态连接类的最佳方法?

玩转JavaScript OOP[2]——类的实现

OOP和面向对象