略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: Serializable::serialize

2024-05-07

Serializable::serialize

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

Serializable::serialize对象的字符串表示

说明

public Serializable::serialize(): ?string

返回对象的字符串表示。

参数

此函数没有参数。

返回值

返回对象的字符串表示或者 null

错误/异常

如果返回除了字符串或 null 之外的其他类型,将抛出 Exception

add a noteadd a note

User Contributed Notes 2 notes

up
19
crog at gustavus dot edu
8 years ago
The documentation here is somewhat misleading. Where it says "This method acts as the destructor of the object. The __destruct() method will not be called after this method," I believe the intent is not that the destructor is not run on the object itself, but that the destructor is not called /as part of the serialization process/.

That is, the object will still be destructed as it goes out of scope as normal, but the destructor is not called as a part of the object's serialization.
up
4
John
4 years ago
I don't like the bad docs here, which are wrongly claiming that "serialize(): This method acts as the destructor of the object. The __destruct() method will not be called after this method.".

They are simply meaning that serialize() will NOT call __destruct(). That is the ONLY thing they mean.

Your object that is being serialized will continue to live as a normal object. So you should NOT treat serialize() as your destructor! Treat your object as a still-living copy that the user may be using!

The destructor will always run as normal, later, when your object goes out of scope (or is forcibly unset() by you)).

Example with proof:

<?php

class A implements Serializable
{
    public
$data = [];

    public function
__destruct()
    {
        echo
"Destruct of A called.\n";
    }

    public function
serialize()
    {
       
printf("- Serialize of %s called.\n", static::class);
        return
serialize($this->data);
    }

    public function
unserialize($serialized)
    {
       
printf("- Unserialize of %s called.\n", static::class);
       
$this->data = unserialize($serialized);
    }
}

class
B extends A
{
    public function
__destruct()
    {
        echo
"Destruct of B called.\n";
    }
}

$a = new A();
$a->data['inner_b'] = new B();
var_dump($a);

echo
"-----------------\n";
echo
"Calling serialize($a):\n";
$str = serialize($a);
echo
"-----------------\n";
echo
"End of script shutdown from here on:...\n";

?>

Result:

```
object(A)#1 (1) {
  ["data"]=>
  array(1) {
    ["inner_b"]=>
    object(B)#2 (1) {
      ["data"]=>
      array(0) {
      }
    }
  }
}
-----------------
Calling serialize($a):
- Serialize of A called.
- Serialize of B called.
-----------------
End of script shutdown from here on:...
Destruct of A called.
Destruct of B called.
```

官方地址:https://www.php.net/manual/en/serializable.serialize.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3