2014-11-24 55 views
3

我发现了一些我在PHP中从未见过的东西。int的var_dump显示UNKNOWN:0

Fatal error: Unsupported operand types in ... on line 41

错误消息指下面的语句:

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

当我在我的脚本运行前的var_dump的$this->lastAction我得到的输出:

UNKNOWN:0 
我的脚本错误中止

我以前从来没有见过。而且我无法想象将这个值分配给我的变量或在什么情况下会发生这种情况。

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

更新1

我发现,如果我在使用PHP 5.3 ENV运行相同的设置,我得到,而不是错误:

Object of class stdClass could not be converted to int ... on line 41

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

UPDATE 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 
} 
+0

'$ this'是什么类型? – 2014-11-24 07:36:32

+0

您可以使用[gettype()](http://php.net/manual/en/function.gettype.php)输出'$ this-> lastAction'的类型。 – Jerodev 2014-11-24 07:37:37

+0

什么是您的PHP版本? – sectus 2014-11-24 07:38:38

回答

0

您所提供的代码完全为我工作。返回的对象是

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

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

+0

正如我所说:除了在一个使用此对象的脚本中,它在所有情况下都能正常工作。这是OO的一个非常基本的用法,所以我猜想它确实是PHP核心中的一个错误。 – TiMESPLiNTER 2014-11-24 08:28:53

+0

听到这个很难过。祝你好运,然后重构 – 2014-11-24 08:32:28

1

嗯,这不是一个明确的答案,但可能会为这个问题提供一些启示。

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

因此,基本上,当一个变量不是NULL布尔整数阵列对象资源那么它的未知类型

我看到这种情况发生时,指针变得无效。

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

由于time()总是返回一个整数(或者,至少,应),那么问题必须位于与$_SESSION['last_action']

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

也许这将有助于你回溯$_SESSION['last_action'],定期检查其价值。

+0

是的,你是对的。我在同一时间有两个类的实例,它在上面提到的会话var中创建了一个混乱。在PHP 5.4和5.5中,我在这个var中有一个'stdClass'对象,我从来没有分配给一个会话,而是在脚本运行时的某个地方使用。在PHP 5.3中,我有这个'UNKNOWN:0'。所以它似乎是PHP中的一个错误,它以某种方式解决了错误的内存我猜。然而,我解决了这个问题,所以我现在只有一个类实例,并得到它的工作。 – TiMESPLiNTER 2014-11-24 12:56:20