PHP 8.4.1 Released!

serialize

(PHP 4, PHP 5, PHP 7, PHP 8)

serializeGera uma representação armazenável de um valor

Descrição

serialize(mixed $value): string

Gera uma representação armazenável de um valor.

É útil para armazenar ou passar um valor do PHP sem perder seu tipo ou estrutura.

Para restaurar uma string serializada de volta a um valor PHP, use unserialize().

Parâmetros

value

O valor a ser serializado. serialize() lida com todos os tipos, exceto recursos (resource) e alguns objetos (object)s (veja nota abaixo). Pode-se até usar serialize() para array que contenha referência a si mesmo. Referências circulaes dentro do array/objeto a ser serializado também serão armazenadas. Qualquer outra referência será perdida.

Ao serializar objetos, o PHP tentará chamar as funções membro __serialize() ou __sleep() antes da serialização. Isto serve para permitir ao objeto alguma limpeza de última hora, etc. antes de ser realizado. Da mesma forma, quando o objeto é restaurado usando unserialize(), a função membro __unserialize() ou __wakeup() será chamada.

Nota:

Os membros privados terão o nome da classe prefixando o nome do membro; membros protegidos terão um '*' prefixando o nome. Estes prefixos serão envolvidos por bytes nulos, um de cada lado.

Valor Retornado

Retorna uma string contendo uma representação em fluxo de bytes de value que pode ser armazenada em qualquer lugar.

Note que esta string é binária e pode incluir bytes nulos, e precisa ser armazenada e gerenciada como tal. Por exemplo, a saída de serialize() deveria ser armazenada geralmente em um campo BLOB de um banco de dados, e não em um campo tipo CHAR ou TEXT.

Exemplos

Exemplo #1 Exemplo de serialize()

<?php
// $session_data contém um array multi-dimensional com informação
// de sessão do usuário atual. serialize() será utilizada para armazenar
// a variável em um banco de dados ao final da requisição.

$conn = odbc_connect("webdb", "php", "chicken");
$stmt = odbc_prepare($conn,
"UPDATE sessions SET data = ? WHERE id = ?");
$sqldata = array (serialize($session_data), $_SERVER['PHP_AUTH_USER']);
if (!
odbc_execute($stmt, $sqldata)) {
$stmt = odbc_prepare($conn,
"INSERT INTO sessions (id, data) VALUES(?, ?)");
if (!
odbc_execute($stmt, array_reverse($sqldata))) {
/* Algo deu errado.. */
}
}
?>

Notas

Nota:

Note que muitos objetos internos do PHP não podem ser serializados. Entretando, os que tiverem esta habilidade ou implementam a interface Serializable ou os métodos mágicos __serialize()/__unserialize() ou __sleep()/__wakeup(). Se uma classe interna não preencher algum desses requisitos, ela não poderá ser serializada com confiança.

Existem algumas exceções histórias à regra acima, onde alguns objetos internos poderiam ser serializados sem implementar a interface ou expor os métodos.

Aviso

Quando serialize() serializa objetos, a barra invertida no início não é incluída nas classes com espaço de nomes para máxima compatibilidade.

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 7 notes

up
357
egingell at sisna dot com
18 years ago
<?
/*
Anatomy of a serialize()'ed value:

String
s:size:value;

Integer
i:value;

Boolean
b:value; (does not store "true" or "false", does store '1' or '0')

Null
N;

Array
a:size:{key definition;value definition;(repeated per element)}

Object
O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}

String values are always in double quotes
Array keys are always integers or strings
"null => 'value'" equates to 's:0:"";s:5:"value";',
"true => 'value'" equates to 'i:1;s:5:"value";',
"false => 'value'" equates to 'i:0;s:5:"value";',
"array(whatever the contents) => 'value'" equates to an "illegal offset type" warning because you can't use an
array as a key; however, if you use a variable containing an array as a key, it will equate to 's:5:"Array";s:5:"value";',
and
attempting to use an object as a key will result in the same behavior as using an array will.
*/
?>
up
279
Anonymous
12 years ago
Please! please! please! DO NOT serialize data and place it into your database. Serialize can be used that way, but that's missing the point of a relational database and the datatypes inherent in your database engine. Doing this makes data in your database non-portable, difficult to read, and can complicate queries. If you want your application to be portable to other languages, like let's say you find that you want to use Java for some portion of your app that it makes sense to use Java in, serialization will become a pain in the buttocks. You should always be able to query and modify data in the database without using a third party intermediary tool to manipulate data to be inserted.

I've encountered this too many times in my career, it makes for difficult to maintain code, code with portability issues, and data that is it more difficult to migrate to other RDMS systems, new schema, etc. It also has the added disadvantage of making it messy to search your database based on one of the fields that you've serialized.

That's not to say serialize() is useless. It's not... A good place to use it may be a cache file that contains the result of a data intensive operation, for instance. There are tons of others... Just don't abuse serialize because the next guy who comes along will have a maintenance or migration nightmare.
up
1
mark at bvits dot co dot uk
1 year ago
There is a type not mentioned in the user notes so far, 'E'. This is the newer Enum class that can be utilised:

login_security|E:25:"Permission:manageClient"
up
20
MC_Gurk at gmx dot net
18 years ago
If you are going to serialie an object which contains references to other objects you want to serialize some time later, these references will be lost when the object is unserialized.
The references can only be kept if all of your objects are serialized at once.
That means:

$a = new ClassA();
$b = new ClassB($a); //$b containes a reference to $a;

$s1=serialize($a);
$s2=serialize($b);

$a=unserialize($s1);
$b=unserialize($s2);

now b references to an object of ClassA which is not $a. $a is another object of Class A.

use this:
$buf[0]=$a;
$buf[1]=$b;
$s=serialize($buf);
$buf=unserialize($s);
$a=$buf[0];
$b=$buf[1];

all references are intact.
up
25
nh at ngin dot de
11 years ago
Serializing floating point numbers leads to weird precision offset errors:

<?php

echo round(96.670000000000002, 2);
// 96.67

echo serialize(round(96.670000000000002, 2));
// d:96.670000000000002;

echo serialize(96.67);
// d:96.670000000000002;

?>

Not only is this wrong, but it adds a lot of unnecessary bulk to serialized data. Probably better to use json_encode() instead (which apparently is faster than serialize(), anyway).
up
11
frost at easycast dot ru
11 years ago
Closures cannot be serialized:
<?php
$func
= function () {echo 'hello!';};
$func(); // prints "hello!"

$result = serialize($func); // Fatal error: Uncaught exception 'Exception' with message 'Serialization of 'Closure' is not allowed'
?>
up
8
Andrew B
12 years ago
When you serialize an array the internal pointer will not be preserved. Apparently this is the expected behavior but was a bit of a gotcha moment for me. Copy and paste example below.

<?php
//Internal Pointer will be 2 once variables have been assigned.
$array = array();
$array[] = 1;
$array[] = 2;
$array[] = 3;

//Unset variables. Internal pointer will still be at 2.
unset($array[0]);
unset(
$array[1]);
unset(
$array[2]);

//Serialize
$serializeArray = serialize($array);

//Unserialize
$array = unserialize($serializeArray);

//Add a new element to the array
//If the internal pointer was preserved, the new array key should be 3.
//Instead the internal pointer has been reset, and the new array key is 0.
$array[] = 4;

//Expected Key - 3
//Actual Key - 0
echo "<pre>" , print_r($array, 1) , "</pre>";
?>
To Top