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 )

È stato utile?

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à .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top