如何在PHP MVC中使所有人都可以访问User类?

时间:2012-10-30 16:31:51

标签: php oop model-view-controller

我正在研究一个PHP MVC,但很难处理设计的某些方面,使得用户信息可以轻松访问所有内容真的令我感到困惑。

我确实将User作为一个抽象类,所以你可以使用User::getUserId(),但我不确定这是正确的方法吗?

我现在已将其更改为以下内容,但它无效。

问题

假设我有一个基本的控制器,我想在每次运行时实例化User类:

控制器

class controller{

    public $user;

    function __construct(){

        $this->user = new User();
        $user->sessionRefresh();
        $user->getUserId();

    }
}

然后我有一个实例化的用户模型类:

用户模型类

class User{

    var $userId;

    function sessionRefresh(){

        if (isset($_SESSION['userId']) && $_SESSION['created'] + 15 * 60 < time())                  
            session_regenerate_id();
    }

    function getUserId(){

        $this->userId = $_SESSION['userId'];
    }
}

然后我有更多控制器扩展默认控制器:

论坛控制器 - 非常简单,只是为了演示我正在尝试的内容

class forumcontroller extends controller{

    function __construct(){

        require 'templates/forum.php';
    }

}

论坛模板 - 非常基本的示例

<html>
<title>Forum</title>
<body>
    <div>Welcome User: <?=$user->userId;?></div>
</body>
</html>

我做错了什么?

我最近才尝试在PHP中从程序跳到mvc / oop,显然它让我感到困惑。

2 个答案:

答案 0 :(得分:2)

  1. 使用$this->user->userId;代替$user->userId;

  2. 你必须回应.... <? echo $user->userId; ?>

  3. 在有人帮助时停止编辑代码

  4. Downvote的Thx

答案 1 :(得分:0)

是的,当谈到MVC设计模式时,你所做的完全错误。部分地,它与MVC是高级模式的事实有关。在你对OOP有充分的了解之前,你甚至不应该尝试使用它。

所以..你的代码存在问题。

  • 使用includerequire时,您“嵌入”的文件位于其使用范围内。阅读variable scopetemplate

  • 模型不是类或对象。它是一个层,包含不同类型结构的多个结构。 This应涵盖简短版本。

  • User实例的交互将是域业务逻辑的一部分,域业务逻辑是模型层的责任。这些都不应该在表示层(主要由视图,控制器和模板组成)中。

  • 视图不是模板。在MVC设计中,模式视图是负责大多数用户界面逻辑的结构。决定应该返回什么样的响应(由多个模板组成的HTML,一些XML或JSON文件,可能只是一个HTTP头)。

  • PHP4中使用var语句来定义类变量。在PHP5中,我们有publicprivateprotected

  • 通常,您不应该在课程中使用公共变量。打破封装。

  • 类构造函数不应执行计算。它使代码难以测试。

更新

底线是:**远离MVC *至少3个月。在充分利用和理解MVC设计模式之前,您需要学习更多关于OOP的知识。

我会推荐this post底部的材料清单。从前两本书开始,然后观看讲座,然后观看PoEAA(列表中的最后一本)书。