2012-08-07 9 views
11

Quali sono i pro e i contro dell'uso di fopen rispetto a SplFileObject in PHP?SplFileObject vs fopen in PHP

Da quello che vedo, SplFileObject genera eccezioni, ove applicabile, il che rende questo conveniente quando si utilizza try...catch per la gestione degli errori. Oltre a questo, ci sono altri motivi per raccomandare l'uno rispetto all'altro?

(Bonus: Perché si chiama SplFileObject Cosa Spl supporto per Perché non semplicemente FileObject???)

Aggiornamento: Una limitazione del SplFileObject è che non fa (ancora) un membro close funzione. In alcuni scenari questo può essere un problema (Esempio: Unlink and SplFileObject).

+2

si potrebbe desiderare di utilizzare il tag [spl] qui. le poche persone che la seguono sono di solito molto entusiaste e ben informate. – goat

+0

@rambocoder Fatto –

risposta

1

Spl è una libreria standard in Php che fa un sacco di cose belle.

Una buona ragione per utilizzare SplFileObject è che rende il codice orientato agli oggetti. Se lo desideri, puoi estendere la classe nella tua base di codice e fargli fare alcune cose belle mentre usi i file, con le nozioni di base già trattate.

4

Spl sta per Standard PHP Library.

Il vantaggio principale è l'orientamento dell'oggetto, che è più adatto per alcuni approcci (non per tutto, cioè). È una buona opzione se devi fornire classi per gestire i file (come nei formati personalizzati, ecc.) Come puoi ereditare da SplFileObject e avere le funzionalità di base già integrate.

La domanda principale qui è quello che vuoi per ottenere con il tuo codice - hai bisogno di aprire un singolo file una volta, leggere i suoi dati e poi lavorare con esso o hai bisogno di fare cose più complesse con uno (o anche più) file.

+0

Ho questa pagina nel mio progetto in cui carico un file CSV e popola un database. Sto usando un 'try ... catch' in ogni pagina per la gestione degli errori. Ho ragione nel pensare che 'SplFileObject' è una buona scelta qui? –

+2

Personalmente preferirei per i dati che vuoi inserire nel tuo database, dato che puoi gestire meglio gli errori, quindi mi piacerebbe andare da solo in questa impostazione generale, poiché vorrei registrare errori, ecc. Tuttavia , se puoi essere sicuro degli input del file (non spezzati, da una fonte automatizzata, ecc.) probabilmente potresti andare per 'fgetscsv' – Florian

14

SPL sta per Standard PHP Library.

SplFileObject utilizza internamente la risorsa di flusso creata con fopen. Quindi la tua domanda dovrebbe essere quando è interessante usare SplFileObject o lavorare direttamente con una risorsa di flusso?

SplFileObject pro:

  • SplFileObject fornire un approccio OOP per la manipolazione di file (fread è stato aggiunto in PHP 5.5.11, fputcsv stato aggiunto in PHP 5.4).

  • SplFileObject implementa diverse interfacce PHP utili per abilitare l'uso di altri SPL Iterator per manipolare meglio il file.

SplFileObject svantaggio principale è che non dà accesso al suo risorsa flusso interno . Le funzioni PHP sono state originariamente create per funzionare direttamente con una risorsa di flusso. Il fatto che il SplFileObject non dà accesso alla propria risorsa flusso interno lo rendono inutilizzabile con molte PHP costruito nelle funzioni:

  • php stream filters utilizzo è povero con SplFileObject.È necessario fare affidamento sul meta wrapper php://filter, che ne limita l'utilità.

  • usando SplFileObject con cURL non è possibile

Per riassumere SplFileObject e una risorsa flusso non sono intercambiabili. Tutto ciò che è stato fatto utilizzando SplFileObject può essere ottenuto utilizzando una risorsa di flusso e un'implementazione di utente SplFileObject ma il contrario non è vero.

Quindi, a seconda del caso d'uso utilizzando una risorsa di flusso creata da fopen può essere una scelta migliore che fare affidamento su SplFileObject.

Per quanto riguarda il metodo close, non è necessario uno ... è sufficiente impostare il gestore su null per rilasciare/chiudere la risorsa di flusso interno.

$file = new SplFileObject('/path/to/my/file'); //the file handler is created 
$file = null; //the file handler is closed