【问题标题】:Serialization of objects and fatal error对象序列化和致命错误
【发布时间】:2010-08-14 07:08:08
【问题描述】:

谁能解释一下,为什么在这种情况下,我们会在会话中获得具有 2 属性的对象?

set_error_handler('my_error_handler');

session_start();

$obj = new myclass();

$_SESSION['obj'] = $obj;

$a->b();

class myclass
{
    private $a = 1;
    private $b = 2;

    public function __sleep()
    {
        return array('a');
    }
}

function my_error_handler($code, $error, $file = NULL, $line = NULL)
{
    throw new ErrorException($error, $code, 0, $file, $line);
}

UPD:我希望在这里得到:
1. 致命错误(通过
2. 会话中的对象(在会话文件中)具有1属性(失败

【问题讨论】:

  • 您的问题不清楚。你在期待什么?
  • @Sarfraz:对不起。问题已更新
  • 午饭后我会调查,但你的脚本真的不应该引发致命错误(顺便说一下错误处理程序不处理致命错误)
  • @Artefacto:确实,他们不应该。但这并不意味着,如果我在常规开发过程中偶尔出错,php 应该会破坏我的数据。
  • “顺便说一句,错误处理程序不处理致命事件”——我知道,但这种情况下的错误处理程序是有意义的

标签: php session serialization fatal-error


【解决方案1】:

原因是致命错误对引擎来说是致命。之后,引擎就不能再调用函数了。

因此,在php_var_serialize_intern 中,call to __sleep 失败。如您所见,如果__sleep 引发了异常,或者根本没有任何__sleep 回调,则您不需要致命错误,则行为将类似。

具体而言,该行为是检索变量的所有实例属性并将生成的哈希表序列化,就好像它属于一个数组一样。

我认为这是一种有效的方法,但也许您认为如果对__sleep 的调用失败,则序列化应该会失败。你可以试试submit a feature request

【讨论】:

  • 我已经填写了错误bugs.php.net/bug.php?id=52604。 “我认为这是一种有效的方法”——它破坏了我的数据,这绝对不是我所期望的。我希望我的数据是安全的 ;-)
  • 所以,因为它是假的/错误的并且它遵循当前的实现 - 没有什么可讨论的了。如果在第二天没有添加答案 - 我会接受这个答案(无论如何我都会接受,但如果有人对我的示例代码中应该发生的事情有想法 - 我想讨论)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2022-01-08
  • 2011-02-07
  • 1970-01-01
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多