【问题标题】:var_dump of an int shows UNKNOWN:0int 的 var_dump 显示 UNKNOWN:0
【发布时间】:2014-11-24 07:32:21
【问题描述】:

我发现了一些我以前在 PHP 中从未见过的东西。我的脚本因错误而中止:

致命错误:第 41 行 ... 中不支持的操作数类型

错误信息是指以下语句:

if($this->lastAction + 7200 <= time()) {
}

当我在脚本中的操作之前 var_dump $this-&gt;lastAction 时,我得到了输出:

UNKNOWN:0

我以前从未见过。而且我无法想象这个值是在哪里分配给我的变量的,或者在什么条件下会发生这种情况。

有没有人暗示或解释这个“价值”来自哪里?

更新 1

我发现如果我在使用 PHP 5.3 的环境上运行相同的设置,我会得到错误:

第 41 行 stdClass 类的对象无法转换为 int ...

但我从来没有将stdClass 实例分配给这个变量。

更新 2

PHP 5.5.19 中也存在问题,与版本 5.4.28 中的错误相同。


AuthHandler.php

abstract class AuthHandler
{
    protected $lastAction;

    public function __construct()
    {
         $this->lastAction = isset($_SESSION['last_action']) ? $_SESSION['last_action'] : time();

         if($this->lastAction + 7200 <= time()) {
             $this->logout();
         }

         $this->lastAction = time();
    }

    public function logout()
    {
        session_destroy();
        session_regenerate_id();

        $this->lastAction = null;
    }

    public function __destruct()
    {
        $_SESSION['last_action'] = $this->lastAction;
    }
}

DBAuthHandler.php

class DBAuthHandler extends AuthHandler
{
    // other stuff here
}

【问题讨论】:

  • $this是什么类型?
  • 你能用gettype()输出$this-&gt;lastAction的类型吗?
  • 它看起来像一个错误。你能创建最少的可重现代码吗?
  • 好的。我想,那么我们需要更多关于这个类的信息来进一步调查。
  • 添加了我的类定义的示例代码

标签: php


【解决方案1】:

嗯,这不是一个确定的答案,但可能会对这个问题有所了解。

检查 PHP 源代码,“未知类型”gettype function 中的默认情况。这同样适用于var_dump function

所以,基本上,当一个变量不是 NULLbooleanintegerdouble、string、arrayobjectresource 那么它是 unknown type

我已经看到当指针无效时会发生这种情况。

$handle = fopen('file.txt','r');
echo gettype($handle); // resource
fclose($handle);
echo gettype($handle); // unknown

由于time() 总是返回一个整数(或者至少应该返回),所以问题一定出在$_SESSION['last_action'] 上。

即使使用多种方法破坏$_SESSION,我也无法重现您的问题。

如果你回溯$_SESSION['last_action'],定期检查它的值,也许会有所帮助。

【讨论】:

  • 是的,到目前为止你是对的。我同时有两个该类的实例,以某种方式在您上面提到的会话变量中造成了混乱。在 PHP 5.4 和 5.5 中,我在这个 var 中有一个 stdClass 对象,我从未分配给会话,而是在脚本运行时的某个地方使用。在 PHP 5.3 中,我有这个 UNKNOWN:0。所以这似乎是PHP中的一个错误,它以某种方式解决了我猜的错误内存。但是我解决了这个问题,所以我现在一次只有一个类实例并且可以正常工作。
【解决方案2】:

您提供的代码非常适合我。返回的对象是

object(App\Http\Controllers\DBAuthHandler)#141 (1) { ["lastAction":protected]=> int(1416817485) } 

所以问题出在尝试设置$_SESSION['last_action']的方法上。

【讨论】:

  • 正如我所说:它适用于所有情况,除了在我使用此对象的一个​​脚本中。而且它是 OO 的一个非常基本的用法,所以我想这确实是 PHP 核心中的一个错误。
  • 听到这个消息很难过。祝你重构好运
猜你喜欢
  • 1970-01-01
  • 2012-10-25
  • 2011-09-08
  • 1970-01-01
  • 2021-05-19
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多