Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对象在使用use关键字传递到匿名函数时丢失数据_Php_Smarty_Slim - Fatal编程技术网

Php 对象在使用use关键字传递到匿名函数时丢失数据

Php 对象在使用use关键字传递到匿名函数时丢失数据,php,smarty,slim,Php,Smarty,Slim,今天遇到了一个奇怪的问题。当使用use关键字传递给匿名函数时,对象似乎失去了以前分配的数据值 我有一个flash消息处理程序,如下所示。注:我已删除smarty配置行,以使样本更干净 $smarty = new Smarty(); $error = getErrorMessage(); $smarty->assign('error', $error); $success = getSuccessMessage(); $smarty->assign('success', $succ

今天遇到了一个奇怪的问题。当使用use关键字传递给匿名函数时,对象似乎失去了以前分配的数据值

我有一个flash消息处理程序,如下所示。注:我已删除smarty配置行,以使样本更干净

$smarty = new Smarty();

$error = getErrorMessage();
$smarty->assign('error', $error);

$success = getSuccessMessage();
$smarty->assign('success', $success);
上面的赋值是在全局范围内完成的,如果我执行下面的代码,就在赋值之后

$error = $smarty->getTemplateVars('error');
echo $error; //displays the proper value
我可以看出该值设置正确。但是当应用程序达到slim操作时,该值似乎丢失了

$app->get("/password", function () use ($app, $smarty) {
    $error = $smarty->getTemplateVars('error');
    echo $error; //displays empty string
    $smarty->display('password.tpl');
});
由于这个问题,在全局范围内分配的值永远不会到达模板。在模板内执行{debug}显示变量值为空。但是,它显示了一个名为error和success的变量,其值为空

有人知道为什么会这样吗

更新

将以下代码块添加到flash消息检索功能后。我可以看到,一旦检索到原始flash消息值,该函数将被第二次调用

function getSessionMessage($key)
{
    $msg = "";
    syslog(LOG_WARNING, "Access" . microtime() . $key);
    if (isset($_SESSION[$key])) {
        $msg = $_SESSION[$key];
        syslog(LOG_WARNING, "Access" . microtime() . $msg);
        unset($_SESSION[$key]);
    }
    return $msg;
}
但是为什么要叫两次呢?我的脚本只运行一次,并且没有会导致触发另一个slim执行周期的错误URL

更新2

进一步诊断表明,flash检索功能被调用两次。但是,apache访问日志仅显示来自浏览器的一个请求

Jun 15 13:35:14 beast apache2: Access0.68291800 1402814114 NEW successGET
Jun 15 13:35:14 beast apache2: Access0.68419200 1402814114 NEW successGET

127.0.0.1 - - [15/Jun/2014:13:35:14 +0700] "GET /cunm/cunm/password HTTP/1.1" 200 1651 "http://localhost/cunm/cunm/password" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36"
似乎有什么原因导致函数被执行了两次

问题

所以我最终发现了问题,如果在slim框架中使用分组,那么即使URL不匹配,也会执行group函数中的代码

$app->group("/admin", function () use ($app, $smarty) {

     //any code here runs even with the URL is not match "/admin"

     $app->get("/servicearea", function () use ($app, $smarty) {
     }

}

显示空字符串您如何知道代码已运行?如果改用var_dump呢?我知道代码运行是因为显示password.tpl,我还使用了一些连接(如echo XXX)进行了测试$错误那么var_dump输出是什么呢?echo不允许您区分0、null和。在编程中,你不会猜测,而是根据事实做出决定。错误报告也可能会有所帮助。@zerkms我已经解决了我的问题。事实上,我有一些旧代码两次调用这个函数。我很感谢你的建议。谢谢我知道你很高兴能放下一个人,继续高谈阔论。我知道你没有什么比坐在那里等亨特更好的事了。另一方面,我每天都做有用的事情。希望有一天你能把你的销售代表换成美元。