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

时间:2013-09-16 10:53:16

标签: php oop serialization

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

1 个答案:

答案 0 :(得分:1)

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

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

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