我正在研究一个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,显然它让我感到困惑。
答案 0 :(得分:2)
使用$this->user->userId;
代替$user->userId;
你必须回应.... <? echo $user->userId; ?>
在有人帮助时停止编辑代码
Downvote的Thx
答案 1 :(得分:0)
是的,当谈到MVC设计模式时,你所做的完全错误。部分地,它与MVC是高级模式的事实有关。在你对OOP有充分的了解之前,你甚至不应该尝试使用它。
所以..你的代码存在问题。
使用include
或require
时,您“嵌入”的文件位于其使用范围内。阅读variable scope和template
模型不是类或对象。它是一个层,包含不同类型结构的多个结构。 This应涵盖简短版本。
与User
实例的交互将是域业务逻辑的一部分,域业务逻辑是模型层的责任。这些都不应该在表示层(主要由视图,控制器和模板组成)中。
视图不是模板。在MVC设计中,模式视图是负责大多数用户界面逻辑的结构。决定应该返回什么样的响应(由多个模板组成的HTML,一些XML或JSON文件,可能只是一个HTTP头)。
PHP4中使用var
语句来定义类变量。在PHP5中,我们有public
,private
和protected
。
通常,您不应该在课程中使用公共变量。打破封装。
类构造函数不应执行计算。它使代码难以测试。
底线是:**远离MVC *至少3个月。在充分利用和理解MVC设计模式之前,您需要学习更多关于OOP的知识。
我会推荐this post底部的材料清单。从前两本书开始,然后观看讲座,然后观看PoEAA(列表中的最后一本)书。