6.13. Трансформация объектов
Функция serialize, о которой рассказывается в главе 15, "Настройка", преобразует переменные, включая и объекты, в строки. Это позволяет хранить трансформированную переменную в файле или пересылать ее по сети. После этого функция unserialize позволит преобразовать строку обратно в соответствующее значение. Если перед преобразованием трансформированного объекта определенного класса определить этот класс, PHP может успешно восстановить свойства и методы этого объекта. В некоторых случаях может потребоваться приготовить специальным образом объект перед трансформированием или подобным образом выполнить некую процедуру после восстановления. Для этого PHP ищет методы __sleep и __wakeup.
При трансформировании объекта PHP вызывает метод __sleep, если он существует. После восстановления объекта PHP вызывает метод __wakeup. Оба этих метода не нуждаются в аргументах. Метод __sleep возвращает массив свойств, которые будут учитываться при сериализации PHP, сбрасывая значения других свойств.
Без метода_sleep PHP сохраняет все свойства.
В листинге 6.16 продемонстрирована трансформация объекта с помощью методов _sleep и_wakeup. Свойство id является временным значением, которое не предназначено для хранения в сохраненном объекте. Метод_sleep гарантирует, что его
не будет в трансформированном объекте. При восстановлении объекта User метод
_wakeup создает для id новое значение. Этот пример можно рассматривать как
вещь в себе. Но есть объекты, содержащие ресурсы, такие как изображения или дескрипторы потоков, для работы которых требуются такие методы.

Листинг 6.16. Трансформация объектов

<?php
class User
{
public $name; public $id;
function __construct()
//присвоить пользователю уникальный идентификатор $this->id = uniqid();
function __sleep()
//не сериализировать this->id return(array("name"));
function __wakeup()
// присвоить пользователю уникальный идентификатор $this->id = uniqid();
}}
//создать объект
$u = new User;
$u->name = "Leon";
// сериализация объекта
$s = serialize($u);
// восстановление объекта
$u2 = unserialize($s);
//$u и $u2 имеют различные идентификаторы
print_r($u);
print_r($u2);
?>

6.14. Пространства имен
Присвоение имен переменным, функциям и классам - процесс крайне деликатный. Кроме подбора имени, точно соответствующего его предназначению, необходимо позаботиться о том, чтобы оно нигде не повторялось. В контексте короткого сценария вторая проблема не играет существенной роли. Но если вы планируете использовать свой код повторно, то в любом будущем проекте не должны использовать ваши имена. В целом повторно используемый код часто встречается в различных функциях или классах, что и является причиной самых разных конфликтов имен переменных. Но и сами функции и классы могут стать причиной конфликтов с дубликатами имен. Решить эту проблему можно путем добавления характерных префиксов в создаваемых классах или применения оператора namespace.
Оператор namespace присваивает имя блоку кода. Но и вне такого блока сценарий может ссылаться на части, находящиеся внутри блока. Для этого с помощью оператора указывается пространство имен. Аналогичным образом делается ссылка на статические элементы классов. Внутри пространства имен задавать пространство имен не нужно, поскольку оно указывается по умолчанию. Этот метод имеет преимущество перед простым заданием префиксов перед именами, а код, таким образом, становится более компактным и удобочитаемым.
А можно ли создать иерархию пространств имен? К сожалению, этого сделать нельзя. Однако PHP позволяет включать в имя пространства имен двоеточие. Но нужно напомнить, что имена переменных, функций и классов не могут содержать двоеточия.
Двоеточие нельзя задавать в качестве первого и последнего символа имени пространства или сразу же после другого двоеточия. Двоеточия в именах пространств для PHP не имеют никакого значения, но разработчик может пользоваться ими для разбиения пространств имен на логические разделы, что может разъяснить любому, кто будет читать ваш код впоследствии, имеющиеся в нем взаимоотношения "предок-потомок".
В операторе namespace нельзя указывать ничего, кроме определений функций, классов или констант. Это позволяет избежать их использования при модификации старых библиотек функций и при использовании ими глобальных переменных. Пространства имен лучше всего подходят при использовании парадигмы ООП. Синтаксис констант в пределах пространств имен соответствует синтаксису констант в классах. Внутри блока пространства имен нельзя использовать функцию define. В листинге 6.17 показано использование пространства имен для простого класса.

| Листинг 6.17. Использование пространства имен_
<?php
namespace core_php:utility
{
class textEngine
{
public function uppercase($text)
{
return(strtoupper($text));
}
}
//создать необъектно- ориентированный интерфейс function uppercase($text)
{
$e = new textEngine; return($e->uppercase($text));
}
}
// протестировать класс в имени пространства $e = new core_php:utility::textEngine; print($e->uppercase("from object") . "<br>"); // протестировать функцию в имени пространства 
print(core_php:utility::uppercase("from function") . "<br>"); // перенести класс в глобальное пространство имен import class textEngine from core_php:utility; $e2 = new textEngine;
?>

Оператор import переносит часть пространства имен в глобальное пространство имен. Для того чтобы с помощью операторов constant, function или class импортировать один элемент пространства имен, задайте тип с именем элемента. Если необходимо импортировать все элементы определенного типа, вместо имени конкретного элемента можно указать *. Для того чтобы импортировать все элементы всех типов, используйте только символ *. После элементов задается имя пространства имен с указанием перед ним ключевого слова from. Таким образом, можно использовать выражение следующего типа: import * from myNamespace или import class textEngine from core_php:utility (см. листинг 6.17).