Вопрос

Может ли кто-нибудь объяснить мне, почему на сессии в этом случае мы получаем объект с 2 характеристики?

set_error_handler('my_error_handler');

session_start();

$obj = new myclass();

$_SESSION['obj'] = $obj;

$a->b();

class myclass
{
    private $a = 1;
    private $b = 2;

    public function __sleep()
    {
        return array('a');
    }
}

function my_error_handler($code, $error, $file = NULL, $line = NULL)
{
    throw new ErrorException($error, $code, 0, $file, $line);
}

Уполномоченный: Здесь я ожидаю получить:
1. Фатальная ошибка (прошло)
2. Объект в сессии (в Файл сеанса) с 1 свойство (неуспешный)

Это было полезно?

Решение

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

Следовательно, в php_var_serialize_intern то позвонить __sleep не удается. Как видите, вам не нужна фатальная ошибка, если __sleep бросил исключение, или если бы не было ни одного __sleep Обратный вызов вообще, поведение будет похоже.

В частности, поведение состоит в том, чтобы извлечь все свойства экземпляра переменной и сериализовать полученный хеш-таблица, как если бы он принадлежал к массиву.

Я думаю, что это действительный подход, но, возможно, вы думаете, что если звонок __sleep Не удается, сериализация должна просто потерпеть неудачу. Вы можете попробовать Отправить запрос на функцию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top