【问题标题】:PHP Class best practices and class structuresPHP 类最佳实践和类结构
【发布时间】:2011-12-29 14:16:44
【问题描述】:

我目前正在用 PHP5 为我的小型网站创建一个简单的 CMS。这是我在 PHP 中的第一个“更大”项目。首先,我正在创建所需的类,这些类可以稍微简化我的工作,但我被困住了。我需要您对我的UserInfo 类中的以下函数的意见:

public function setUser($id) {
        if(!isset($id)) {
            return false;
        }

        session_start();
        $conn = new mysql($_SESSION['DBCONNINFO']);
        $sql = "SELECT
                usr.ID,
                usr.USERNAME as TUSERNAME,
                usr.FIRST_NAME,
                usr.LAST_NAME,
                usr.PHONE,
                usr.MOBILE,
                usr.EMAIL,
                usr.ADDITIONAL_INFO,
                usr.LAST_LOGIN_DATE,
                usr.USER_GROUP_ID
                FROM cms_users usr
                WHERE usr.id = " . $id;

        $result = $conn->query_cust($sql);
        $conn=null;

        foreach ($result as $row) {
            $this->id = $row['usr']['ID'];
            $this->username = $row['usr']['TUSERNAME'];
            $this->firstname = $row['usr']['FIRST_NAME'];
            $this->lastname = $row['usr']['LAST_NAME'];
            $this->phone = $row['usr']['PHONE'];
            $this->mobile = $row['usr']['MOBILE'];
            $this->email = $row['usr']['EMAIL'];
            $this->additional_info = $row['usr']['ADDITIONAL_INFO'];
            $this->last_login_date = $row['usr']['LAST_LOGIN_DATE'];
            $this->user_group = $row['usr']['USER_GROUP_ID'];
        }

        return true;
    }  

我这样做是否正确,我不是在谈论语法,现在我专注于类结构、设计和最佳实践 - 任何意见都将不胜感激。

我可以在类构造函数中调用session_start(),并使用其中的变量,而不是每次都在函数中调用它!?

我应该通过close() 函数关闭数据库连接还是$conn=null 可以接受!?

将数据库信息存储在会话类中是一种不好的做法吗!?如果是,将其作为“全局”变量存储在哪里 - $_GLOBAL !?

如果有 'PHP bes practice class structure in 5 minutes for dummy',请通知我 :)

提前致谢。

【问题讨论】:

  • @igorw 哇,那篇文章很有趣。我已经做了很长时间的依赖注入,但不知道它是这样调用的。使用这条路线对我来说是有意义的,我建议 AlenBer 遵循这条路线,即使它在架构层面上非常技术性但在编码层面上很简单

标签: php html web


【解决方案1】:

使用define 定义所有常量。
例如:

define('DBCONNINFO', "something");

此外,您只需调用一次session_start(),即可在脚本中的任何位置调用。

【讨论】:

  • 好吧,$_SESSION['DBCONNINFO'] 数组数据是在文件系统上的 INI 文件中定义的,我从中读取信息并存储到会话中,所以我可以做同样的事情并将数据存储为“定义”常量!?
  • @AlenBer 你不能用define 保存数组,但你可以用json_*code*plode 函数将数组转换为字符串然后再返回
  • 我宁愿使用类常量也不愿污染全局命名空间。
【解决方案2】:

如果您仍然使用会话,则为每个请求从数据库中获取数据没有多大意义。在这种情况下,为什么会在 setUser() 方法中调用 session_start()?

当您只提供一个方法时,我们无法真正评论类结构。

此外,由于离开 PHP 的数据的表示应该适合于该数据去往的底层(以防止 SQL 注入、电子邮件标头注入、CSS ......),因此最好将更改推迟到数据直到它离开 PHP 之前。例如

$sql = "SELECT
       ....
            WHERE usr.id = " . mysql_real_escape_string($id);

(或使用绑定参数)

但是,由于用户通常通过用户名而不是用户 ID 来识别自己,这反而意味着 $id 来自用户提供的数据以外的其他地方 - 在这种情况下是哪里?当您已经获得会话的标识符(应该存储此数据的位置)时,为什么还要使用它作为标识符。

或者你想使用这个类来处理与当前会话用户以外的用户相关的数据 - 在这种情况下,不可能那里应该有一个 session_start() .

抱歉,这不是经过深思熟虑的代码,也不是一个很好的问题。

顺便说一句,将连接设置为 null 不会关闭数据库连接。

【讨论】:

  • 这就是我发布问题的原因。我不确定如何构建这些类,例如一个简单的用户管理表单。所以我盯着 UserInfo 类,只是添加了一个函数来通过用户唯一 ID 从数据库中检索数据。其余的类代码只是定义的变量(用户名、名字、姓氏等)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
相关资源
最近更新 更多