0

有人可以解释当 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 可以包含一个函数)并在尝试调用该方法时引发错误。

4

1 回答 1

1

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

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

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

于 2013-09-16T10:58:22.100 回答