Sérialisation d'objets et erreur fatale
-
28-09-2019 - |
Question
Quelqu'un peut-il me expliquer, pourquoi lors de la séance dans ce cas, nous obtenons l'objet avec 2 propriétés?
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);
}
UPD : ici je vous attendre à obtenir:
1. erreur fatale ( passé )
2. objet en session ( fichier de session ) 1 propriété ( a échoué )
La solution
La raison est qu'une erreur fatale est, bien, fatale au moteur. Après cela, le moteur ne peut pas appeler plus de fonctions.
Par conséquent, dans la php_var_serialize_intern
appel à __sleep
échoue. Comme vous pouvez le voir, vous n'avez pas besoin d'une erreur fatale, si __sleep
avait jeté une exception, ou s'il n'y avait pas de rappel __sleep
du tout le comportement serait similaire.
En particulier, le comportement est de récupérer toutes les propriétés d'instance de la variable et de sérialisation la table de hachage comme si elle appartenait à un tableau.
Je pense que cette approche est valable, mais peut-être que vous pensez que si l'appel à __sleep
échoue, la sérialisation doit échouerait. Vous pouvez essayer de soumettre une demande de fonctionnalité .