我在PHP中发现了一些我以前从未见过的东西。我的脚本中止并出现错误:
致命错误:不支持的操作数类型...在第 41 行
错误消息引用以下语句:
if($this->lastAction + 7200 <= time()) {
}
当我在脚本中的操作之前var_dump $this->lastAction
时,我得到输出:
UNKNOWN:0
我以前从未见过。我无法想象这个值在哪里分配给我的变量或在什么条件下发生这种情况。
有没有人暗示或解释这个"价值"从何而来?
更新 1
我发现如果我在使用 PHP 5.3 的环境上运行相同的安装程序,我会收到错误:
类 stdClass 的对象无法转换为 int ...在第 41 行
但我从来没有为这个变量分配一个stdClass
实例。
更新 2
PHP 5.5.19
中也存在问题,错误与版本 5.4.28
相同。
身份验证处理程序.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
}
好吧,这不是一个明确的答案,但可能会对这个问题有所了解。
检查PHP源代码,"未知类型"是gettype函数中的默认情况。这同样适用于var_dump函数。
因此,基本上,当变量不是 NULL、布尔值、整数、双精度、字符串、数组、对象或资源时,它是未知类型的。
我已经看到当指针无效时会发生这种情况。
$handle = fopen('file.txt','r');
echo gettype($handle); // resource
fclose($handle);
echo gettype($handle); // unknown
由于 time() 总是返回一个整数(或者至少应该返回),那么问题必须出在 $_SESSION['last_action']
上。
即使使用多种方法来破坏$_SESSION
,我也无法重现您的问题。
如果您回溯$_SESSION['last_action']
,定期检查其值,也许会有所帮助。
您提供的代码非常适合我。返回的对象是
object(App'Http'Controllers'DBAuthHandler)#141 (1) { ["lastAction":protected]=> int(1416817485) }
因此,问题将出在尝试设置$_SESSION['last_action']
的方法中。