Сериализация
Сериализация
Сериализация ( функция serialize() )возвращает строковое представление любого значения. Функция unserialize() используется, чтобы восстановить значение в объект
Чтобы десериализовать объект функцией unserialize(), необходимо заранее определить класс этого объекта
Методы в объекте не будут сохранены, только имя класса
Статические элементы объекта не сериализуются
Если в приложении сериализуются объекты, которые будут использованы в приложении позже, следуют строгой рекомендации — подключать определение класса для этого объекта во всём приложении. При невыполнении этого требования десериализация объекта пройдёт и без определения класса, но PHP назначит этому объекту класс __PHP_Incomplete_Class_Name, у которого нет методов, и сделает объект бесполезным
#Test.php
class Test
{
public $var1 = "test1";
public $var2 = "test2";
protected $var3 = "test3";
private $var4 = "test4";
public function __construct()
{
}
public function testFunc()
{
echo "testFunc()";
}
public function start()
{
echo "start()";
}
}
#test.php
include "Test.php";
$class1 = new Test;
#Сериализовать объект в строку
$s = serialize($class1);
#Поместить строку в отдельный файл
file_put_contents('testFile', $s);
#page.php
#Подключить файл с определением класса
include "Test.php";
#Получить строку и сохранить в переменную
$s = file_get_contents('testFile');
echo $s;
#O:4:"Test":4:{s:4:"var1";s:5:"test1";s:4:"var2";s:5:"test2";s:7:"*var3";s:5:"test3";s:10:"Testvar4";s:5:"test4";}
echo "<br>";
echo "<br>";
#Преобразовать строку в объект
$class2 = unserialize($s);
var_dump($class2);
#При попытке восстановить объект без определения исходного метода
#object(__PHP_Incomplete_Class)#1 (5) { ["__PHP_Incomplete_Class_Name"]=> string(4) "Test" ["var1"]=> string(5) "test1" ["var2"]=> string(5) "test2" ["var3":protected]=> string(5) "test3" ["var4":"Test":private]=> string(5) "test4" }
echo "<br>";
echo "<br>";
#Получить значения переменных
echo $class2->var1;
echo "<br>";
#Вызов метода
$class2->start();
Обратите внимание, что, кроме уже приведённого совета, можно подключиться к событиям сериализации и десериализации объекта через методы __sleep() и __wakeup(). В методе __sleep() можно управлять тем, какие свойства объекта будут сериализованы.
Ключевое слово Final
Ключевое слово final, которое указали перед определением метода или константы, не даёт дочерним классам переопределять этот метод или константу. Ключевое слово не даст расширить класс, если класс определили окончательным
Источники
Связанные темы
Оператор разрешения видимости в php
Позднее статическое связывание
Методы создания экземпляра класса в php
Автоматическая загрузка классов
Наследование с помощью extends в php
Конструкторы и деструкторы в php