序列化 PHP 类的方法会发生什么情况



有人可以解释一下当 php 类被序列化时方法会发生什么吗?当我转储或序列化类时,我在输出中看不到它们,并且在创建实例后,从字符串序列化时似乎可以使用对该方法的引用(?)。

这是给出令人惊讶的输出的代码:

class ticket { 
    public $film="Killer bananas 3";
    public function invalidate(){
        echo '*punch*';
    }
}
$myticket = new ticket();
var_dump($myticket);
var_dump(serialize($myticket));
echo "output #1: ";
echo $myticket->invalidate().PHP_EOL;
$temp = serialize($myticket);
$newticket = unserialize($temp);
echo "output #2: ";
echo $newticket->invalidate().PHP_EOL;
$ticketfromstring = unserialize('O:6:"ticket":1:{s:4:"film";s:28:"Attack of the killer bananas";}');
echo "output #3: ";
echo $ticketfromstring->invalidate().PHP_EOL;

输出:

me@box:~# php -f /home/ekomi/includes/classes/class.test.php
object(ticket)#1 (1) {
  ["film"]=>
  string(16) "Killer bananas 3"
}
string(52) "O:6:"ticket":1:{s:4:"film";s:16:"Killer bananas 3";}"
output #1: *punch*
output #2: *punch*
output #3: *punch*

这种行为很奇怪(尤其是最后一个!

请注意,我已经测试了json_encode,它只提供属性(即使 JSON 可能包含函数)并在尝试调用该方法时抛出错误。

序列化仅将对象属性保存到字符串中,因为这就是我们所需要的。所有方法都是在 PHP 代码中定义的。

当你尝试反序列化对象时,PHP 将查找它的类。然后将使用反序列化字符串的属性从该类创建对象。

您可以通过在一个脚本中序列化对象并在另一个脚本中反序列化它来检查它(不使用类定义)。PHP 将显示错误,因为反序列化是不可能的。

相关内容

最新更新