Serializzazione degli oggetti e errore fatale
-
28-09-2019 - |
Domanda
Qualcuno mi può spiegare, perché nella sessione in questo caso si ottiene l'oggetto con 2 le proprietà?
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 : qui mi aspettavo di ottenere:
1. errore fatale ( passato )
2. oggetto in sessione (in file di sessione ) con 1 di proprietà ( fallito )
Soluzione
La ragione di questo è che un errore fatale è, beh, fatale al motore. Dopo che, il motore non può chiamare più funzioni.
Quindi, in php_var_serialize_intern
chiamata a __sleep
fallisce. Come si può vedere, non è necessario un errore fatale, se __sleep
avesse gettato un'eccezione, o se non ci fosse alcun callback __sleep
affatto, il comportamento sarebbe simile.
In particolare, il comportamento è di recuperare tutte le proprietà della variabile istanza e per serializzare la tabella hash risultante come appartenente ad un array.
Credo che questo sia un valido approccio, ma forse si pensa che se la chiamata a __sleep
fallisce, la serializzazione deve solo riuscire. Si può provare a presentare una richiesta di funzionalità .