|
после прочтения описания функций implode() и explode() вы обрадова-
лись, насколько просто можно сохранить массив, например, в файле, а затем его
оттуда
считать и быстро восстановить. Если вас посетила такая мысль, то, скорее всего,
вы уже
успели в ней разочароваться: во-первых, таким образом можно сохранять только
массивы-
списки (потому что ключи в любом случае теряются), а во-вторых, ничего не
выйдет с
многомерными массивами.
Давайте теперь предположим, что нам все-таки нужно сохранить какой-то массив
(причем неизвестно заранее, сколько у него измерений) в файле, чтобы потом, при
следующем запуске сценария, его аккуратно загрузить и продолжить работу. Можно,
конечно, начинать писать универсальную рекурсивную функцию для упаковки масси-
ва в строку (ведь в файлы можно писать только строки), и еще одну, которая
будет
эту строку разбирать и восстанавливать на ее основе массив в исходном виде.
Рекомендую проделать это в качестве упражнения, заодно постарайтесь до-
биться, чтобы упакованные данные занимали минимум объема. Это пригодит-
ся вам в будущем, при работе с Cookies.
Однако вскоре вы поймете, что все не так просто в PHP, в котором работа со
ссылоч-
ными переменными очень и очень ограничена. Особенно будет тяжело с функцией
распаковки строки.
И тут нам на помощь опять приходят разработчики PHP. Оказывается, обе функции
давным-давно реализованы, причем весьма эффективно со стороны быстродействия
(но, к сожалению, непроизводительно с точки зрения объема упакованных данных).
Называются они, соответственно, Serialize() и Unserialize().
Часть III. Основы языка PHP 180
Функция Serialize() возвращает строку, являющуюся упакованным эквивалентом
некоего объекта $Obj, переданного во втором параметре.
string Serialize(mixed $Obj)
При этом совершенно не важно, что это за объект: массив, целое число…. Да что
угодно. Например:
$A=array("a"=>"aa", "b"=>"bb", "c"=>array("x"=>"xx"));
$st=Serialize($A);
echo $st;
// выведется что-то типа нечто:
//
a:2:{s:1:"a";s:2:"aa";s:1:"b";s:2:"bb";s:1:"c";a:1:{s:1:"x";s:2:"xx";}}
Вообще-то, я не уверен, что в будущих версиях PHP такой формат "упаковки"
сохра-
нится неизменным, хотя это очень и очень вероятно.
Функция Unserialize(), наоборот, принимает в лице своего параметра $st строку,
ранее созданную при помощи Serialize(), и возвращает целиком объект, который
был упакован.
mixed Unserialize(string $st)
Например:
$a=array(1,2,3);
$s=Serialize($a);
$a="bogus";
echo count($a); // выводит 1
$a=Unserialize($s);
echo count($a); // выводит 3
Еще раз отмечу: сериализовать можно не только массивы, но и вообще что угодно.
Однако в большинстве случаев все-таки используются массивы. Механизм сериали-
зации часто применяется также и для того, чтобы сохранить какой-то объект в
базе
данных, и тогда без сериализации практически не обойтись.
Глава 11
Функции и области
видимости
По синтаксису описания функций PHP, на мой взгляд, довольно близок к идеальной
концепции, которую многие программисты лелеют в своем воображении. Вот не-
сколько основных достоинств этой концепции:
r вы можете использовать параметры по умолчанию (а значит, функции с перемен-
ным числом параметров);
r области видимости переменных внутри функций представляются в древовидной
форме, как и в других языках программирования;
r существует удобная инструкция return, которой так не хватает в Паскале;
r тип возвращаемого значения может быть любым;
r как мы увидим дальше, функции можно использовать не только по их прямому
назначению, но и для автоматизации создания "библиотекарей" и даже написания
своего собственного интерфейса библиотечных файлов.
К сожалению, разработчики PHP не предусмотрели возможность создания локальных
функций (то есть одной внутри другой), как
|
|