我是PHP的新手。我使用MVC项目作为示例,我注意到每次按下提交按钮时,我的控制器都会被调用。这个问题是每次按下按钮时都会创建一个新模型。
为了解决这个问题,我使用了一个隐藏字段来检查按钮是否已被按下。如果有,那么我不会实例化新模型,否则我会这样做。来自控制器的代码如下:
//code listed below is in the controller which is called each time button
//has been pressed...
$myModel;//used to access model and its functions from controller
if(isset($_POST['has_started']))
{
//stores some logic that uses $myModel variable
playingGame();
}
else
{
echo "just starting...";
$myModel=new HangManModel();
startGame($myModel);
}
这似乎有效,但是当playGame()被调用时,它告诉我我不能使用$ myModel及其函数,因为它没有声明,或者它是非对象。我怎样才能解决这个问题?谢谢你的帮助!
答案 0 :(得分:1)
首先,我看到没有mvc模式。 其次,php执行并生成html和javascript输出并发送到浏览器。 在下一个回发中,php不存储任何状态。
根据我的理解,对于存储状态,您可以使用以下其中一种。
1)选项1 - >使用会话。
//code listed below is in the controller which is called each time button
//has been pressed...
$myModel;//used to access model and its functions from controller
if(!isset($_SESSION)){session_start();}
if(isset($_POST['someuniqueID']))
{
//stores some logic that uses $myModel variable
$someuniqueID = $_POST['someuniqueID'];
$myModel = $_SESSION[$someuniqueID]; //retrieving the session object.
playingGame($myModel); //passing your model to the main function.
}
else
{
echo "just starting...";
$myModel=new HangManModel();
//start session
$_SESSION['someuniqueID'] = $myModel; // do not store very complex model object to avoid server memory problem.
startGame($myModel);
}
2)选项2 - >您可以序列化该对象并将其发送到隐藏字段然后它将被回发但这将带来消耗带宽问题。每次发布页面时,它都会来回发送您的模型。
3)选项3 - >如果模型很大,请使用数据库并创建临时表,您可以在其中存储唯一的ID和序列化的$ myModel对象。您需要从数据库中清除不需要的状态。因为与会话和隐藏字段不同,它是永久存储。