Perché la serializzazione di SplFileInfo non è consentita?

Sto cercando di memorizzare una serie di istanze SplFileInfo in una cache con il command serialize ma il command lancia questa exception:

 Exception' with message 'Serialization of 'SplFileInfo' is not allowed 

Perché non è permesso?

Grazie!

Nota: sono solo curioso Il problema stesso può essere risolto.

Gli oggetti basati su Resources non possono essere serializzati.

Immagino di non wherer spiegare perché (se hai bisogno della spiegazione dimmi anche se è OT in questa domanda)

appendice

Per @Charles che non crede che SplFileInfo non archivi / apra una nuova risorsa, ho realizzato un piccolo script di test.

Se esegui questo:

 new SplFileInfo('index.php'); $link=mysql_connect('localhost','root',''); echo $link; 

L'output è: ID risorsa # 2

Se esegui questo:

 //new SplFileInfo('index.php'); $link=mysql_connect('localhost','root',''); echo $link; 

L'output è: ID risorsa # 1.

SplFileInfo non può essere serializzato perché il team di PHP lo ha contrassegnato come non serializzabile. In realtà, questo non è sorprendente: l'unico dato reale che un object SplFileInfo dovrebbe contenere sarebbe il nome file . Ogni metodo nella class è effettivamente un wrapper per la function standard non OO che fa la stessa cosa. Queste chiamate al metodo vengono risolte in fase di call time , non quando viene creato l'object, pertanto la serializzazione dell'object non acquisisce lo stato del file come era in fase di serializzazione.

Se stai cercando di creare un elenco di file da ricordare in seguito, crea l'elenco dai nomi dei file.

Se stai cercando di creare un elenco di file e le loro properties; in un momento specifico, prendi quelle properties; e memorizzale al posto dell'object. * Tieni presente che PHP memorizza nella cache i risultati delle funzioni basate sulle stat , quindi non è necessario aggiungere un altro livello di memorizzazione nella cache.


Ecco il file C contenente i meccanismi sottostanti per SplFileInfo e SplFileObject . Il metodo utilizzato da SPL per aprire un handle di file è chiamato spl_filesystem_file_open . Se cerchi il file, vedrai quattro riferimenti ad esso. Uno è la definizione della function. Uno è nel constructor per SplFileObject . Uno è nel constructor per SplTempFileObject .

Ci sono altri riferimenti in là, quando si lavora con entity framework; sul filesystem, di una definizione chiamata SPL_FS_FILE . SPL_FS_FILE switch con SPL_FS_FILE come una delle condizioni è la quarta e ultima chiamata spl_filesystem_file_open . È all'interno di una function chiamata spl_filesystem_object_create_type , che crea l' effettiva struttura interna su cui lavorano i vari oggetti SPL basati su file system. Si noti che proprio sopra il caso SPL_FS_FILE c'è un caso SPL_FS_INFO , che gestisce i casi SplFileInfo e nota come quel codice non contenga un filehandle aperto.

Questa è una prova concreta che SplFileInfo non contiene una risorsa di gestione file.

Il file contiene anche il codice che impedisce a SplFileInfo di essere serializzato, contrassegnandolo come non serializzabile … senza commenti. Darn.


Debunking del problema delle risorse ancora più al prompt interattivo di PHP

 [charles @ duo ~ / splfileinfo_test] $ touch abcde
 [charles @ duo ~ / splfileinfo_test] $ php -a
 Shell intertriggers

 php> $ fh_a = fopen ('./ a', 'r');
 php> echo $ fh_a;  # dovrebbe essere 1
 ID risorsa n. 2
 php> # COSA.
 php> $ fh_b = fopen ('./ b', 'r');
 php> echo $ fh_b;  # dovrebbe essere ... uh ... 3 ora?
 ID risorsa # 3
 php> $ fi_c = new SplFileInfo ('./ c');
 php> $ fh_d = fopen ('./ d', 'r');
 php> echo $ fh_d;  # dovrebbe essere 4 se SplFileInfo non ha risorse interne
 ID risorsa # 4
 php> exit
 [charles @ duo ~ / splfileinfo_test] $ php -v
 PHP 5.3.6 (cli) (compilato: 19 marzo 2011 07:44:03)
 Copyright (c) 1997-2011 Il gruppo PHP
 Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies
     con Xdebug v2.1.0, Copyright (c) 2002-2010, di Derick Rethans