Сериализует ли PHP методы объекта? - PullRequest
4 голосов
/ 04 июля 2011

Справочные руководства по PHP говорят, что при сериализации объекта методы не будут сохранены.(См. http://www.php.net/manual/en/language.oop5.serialization.php, параграф 1).

Однако первый пример, приведенный в руководстве, показывает сериализацию, а затем сериализацию и использование метода.

Разве это не противоречие?Я что-то упустил?

Ответы [ 2 ]

11 голосов
/ 04 июля 2011

Я должен сказать, что я не вижу, где метод сериализуется в первом примере.При сериализации никакие методы не сериализуются, только имя класса и свойства.Это можно увидеть, если взглянуть на сериализованные данные

$ser = serialize($object);
var_dump($ser);

. Вы заметите, что ни один из методов не упомянут.Однако, если вы десериализуете объект, он воссоздается по имени класса.Или другими словами: вы получите новый объект, но со значениями, которые вы сериализовали ранее.

Обычно это не так важно, как кажется, потому что обычно сериализованный / несериализованный объект должен вести себя так же.

// serialize 
class A {
  public $a = null;
  public function test () {
    echo "Hello";
  }
}
$a = new A;
echo $a->test(); // "Hello"
$x = serialize($a);

// unserialize (somewhere else)
class A {
  public $a = null;
  public function test () {
    echo "World";
  }
}
$a = unserialize($x);
echo $a->test(); // "World"

Здесь сериализатор использует «неправильный» класс, и вывод отличается от ожидаемого.Пока вы убедитесь, что нет конфликтов имен классов, вам обычно не нужно об этом думать.

2 голосов
/ 04 июля 2011

Метод не сериализован, но класс, членом которого является объект:

Методы в объекте не будут сохранены, только имя класса .

Поэтому, когда вы десериализуете, вы получаете экземпляр того же класса, так что вы можете вызывать метод для этого несериализованного экземпляра, так как метод является частью определения класса, а не членом самого объекта. Это, конечно, предполагает, что у вас точно такое же определение класса во время десериализации:

Чтобы иметь возможность десериализации () объекта, необходимо определить класс этого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...