【问题标题】:How can I make User class accessible to all in a PHP MVC?如何使 PHP MVC 中的所有人都可以访问 User 类?
【发布时间】:2012-10-20 01:29:14
【问题描述】:

我正在开发一个 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 的飞跃,显然它仍然让我感到困惑。

【问题讨论】:

  • 顺便说一句。你不能实例化一个抽象类;)
  • “我确实将 User 作为一个抽象类,所以你可以使用 User::getUserId() 但我不确定这是正确的做法吗?” ..c2.com/cgi/wiki?AbstractClass
  • 你必须回应 .... userId; ?>
  • ok 没用过,在 php.net 上找不到
  • 可能是 var $userId;将是私有的,你为什么不在 echo 上使用 getter 呢?

标签: php oop model-view-controller


【解决方案1】:
  1. 使用$this-&gt;user-&gt;userId; 而不是$user-&gt;userId;

  2. 你必须回显....&lt;? echo $user-&gt;userId; ?&gt;

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

  4. 谢谢支持

【讨论】:

  • @Dukeatcoding:SO 的编辑器有点问题。您必须以特殊的方式输入内容才能获得所需的结果。例如,您不能从编号列表开始。
  • $this-&gt;user-&gt;userId;$this-&gt;$user-&gt;userId;有什么区别?
  • @JvdBerg thx 提到它,当我发布大量代码时,将它稍微格式化总是不容易,而且我根本看不到格式化的意义这些小事
  • @Silver89 也许你就在这里 $this->$user->userid;可能是对的 (php.net/manual/en/language.oop5.php)
【解决方案2】:

是的,就 MVC 设计模式而言,您所做的完全错误。部分原因在于 MVC 是一种高级模式。在您充分了解 OOP 之前,您甚至不应该尝试使用它。

所以 .. 你的代码有问题。

  • 当您使用includerequire 时,您“嵌入”的文件在使用它的范围内。了解variable scopetemplate

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

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

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

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

  • 一般来说,类中不应有公共变量。打破封装。

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

更新

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

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

【讨论】:

  • 谢谢这是一个有用的答案
猜你喜欢
  • 1970-01-01
  • 2018-11-06
  • 2015-09-20
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多