-3

我对这段代码感到困惑

<?php

$input = 'O:1:"B":1:{s:6:"secret";s:6:"Got_it";}';
$o = unserialize($input);
//echo $o;  
print_r($o->secret);

?>

我试图获取 $o->secret 但它发生了这个错误:

注意: main():脚本试图执行方法或访问不完整对象的属性。请确保您尝试操作的对象的类定义“B”在 调用 unserialize()之前已加载或提供 __autoload() 函数以加载 /home/mikun/public_html/tested.php 中的类定义 第 6 行

请帮我解决它!

4

2 回答 2

4

您的代码正在反序列化该类的对象B

$input = 'O:1:"B":1:{s:6:"secret";s:6:"Got_it";}';
               ^

PHP 无法反序列化对象,除非它知道B应该是什么样的类,因此首先需要定义。在这种情况下,您需要在调用B 之前指定一个类定义。unserialize()例如:

class B {
    public $secret;
    public $param2;
};

$input = 'O:1:"B":1:{s:6:"secret";s:6:"Got_it";}';
$o = unserialize($input);
//$o is now an instance of class B
print_r($o->secret); //prints "Got_it"
于 2013-06-28T17:52:38.827 回答
1

如果您不需要 B 类来构造数据,则可以通过将 B 类编辑为 stdClass 来修复序列化字符串。这样做你会改变

O:1:"B":1:{s:6:"secret";s:6:"Got_it";}

O:8:"stdClass":1:{s:6:"secret";s:6:"Got_it";}

你会注意到O:1变成O:8. 这告诉 php 对象名称现在是八个字符长stdClass

于 2013-06-28T18:16:43.907 回答