不是真的,或者至少我会非常害怕在生产中使用这样的东西。
但是,unserialize 将使用自动加载系统或在unserialize_callback_func ini 设置中指定的函数名称。因此,只需稍加修改,您就可以完成这项工作:
// this a serialized object with the class "SomeMissingClass"
$str = 'O:16:"SomeMissingClass":1:{s:1:"a";s:1:"b";}';
ini_set('unserialize_callback_func', 'define_me'); // set your callback_function
// unserialize will pass in the desired class name
function define_me($classname) {
// just create a class that has some nice accessors to it
eval("class $classname extends ArrayObject {}");
}
$object = unserialize($str);
print $object['a']; // should print 'b'
您可以使用类似的方法将数据迁移到更方便的格式。
更新:
我已经咨询了我被压抑的记忆(我曾经遇到过类似的事情)并记住了另一个解决方案:
所以你的SomeClass 有一个名为private 的属性$a
class SomeClass {
private $a;
public function getA(){
return $this->a;
}
}
你有它的序列化版本:
$str = 'O:9:"SomeClass":1:{s:1:"a";s:1:"b";}';
当你反序列化它并转储结果时,它会看起来像这样,这是不好的:
$a = unserialize($str);
var_dump($a->getA()); // prints 'null'
var_dump($a);
/*
prints:
object(SomeClass)#1 (2) {
["a":"SomeClass":private]=>
NULL
["a"]=>
string(1) "b"
}
*/
现在,当一个对象被反序列化时,php 将调用它的__wakeup 魔术方法。您需要的数据在对象中,但不在私有属性下,而是在类似名称的公共属性下。你不能用$this->a 来实现它,因为它会寻找错误的,
但是 get_object_vars() 方法将返回这些属性,您可以在 __wakeup() 中重新分配它们:
class SomeClass {
private $a;
public function getA(){
return $this->a;
}
public function __wakeup(){
foreach (get_object_vars($this) as $k => $v) {
$this->{$k} = $v;
}
}
}
$str = 'O:9:"SomeClass":1:{s:1:"a";s:1:"b";}';
$a = unserialize($str);
print $a->getA();
我认为不用多说,您应该为自己省去更多的麻烦,并将您的数据转换为某种专用的数据交换格式。