2012-08-07 26 views
11

¿Cuáles son los pros y los contras de usar fopen en comparación con SplFileObject en PHP?SplFileObject vs fopen en PHP

Según lo que veo, SplFileObject arroja excepciones donde corresponda, lo que lo hace conveniente al usar try...catch para el manejo de errores. Aparte de esto, ¿hay alguna otra razón para recomendar uno sobre el otro?

(Bonus: Por qué se llama SplFileObject ¿Qué Spl soporte para ¿Por qué no simplemente FileObject???)

Actualización: Una limitación del SplFileObject es que no tiene (todavía) un miembro de close función. En algunos escenarios, esto puede ser un problema (Ejemplo: Unlink and SplFileObject).

+2

es posible que desee utilizar la etiqueta [spl] aquí. las pocas personas que lo siguen suelen ser muy entusiastas y conocedores. – goat

+0

@rambocoder Hecho –

Respuesta

1

Spl es una biblioteca estándar en Php que hace muchas cosas buenas.

Una buena razón para usar SplFileObject es que hace que su código sea Orientado a Objetos. Si lo desea, puede extender la clase en su propia base de códigos y hacer algunas cosas agradables al usar archivos, con los conceptos básicos ya cubiertos.

4

Spl significa Standard PHP Library.

La principal ventaja es la orientación del objeto, que es más adecuado para algunos enfoques (no para todo, es decir). Es una buena opción si tiene que proporcionar clases para manejar archivos (como en formatos personalizados, etc.) ya que puede heredar desde SplFileObject y tener la funcionalidad básica ya incorporada.

La pregunta principal aquí es lo que quiere para lograr con su código, ¿necesita abrir un solo archivo una vez, leer sus datos y luego trabajar con él o necesita hacer cosas más complejas con uno (o incluso más) archivos?

+0

Tengo esta página en mi proyecto donde cargo un archivo CSV y llene una base de datos. Estoy usando un 'try ... catch' en cada página para el manejo de errores. ¿Estoy en lo cierto al pensar que 'SplFileObject' es una buena opción aquí? –

+2

Personalmente, lo prefiero para los datos que desea poner en su base de datos, ya que puede hacer un mejor manejo de errores, por lo que me gustaría ir a eso en esta configuración general, ya que me gustaría registrar errores, etc. Sin embargo , si puede estar seguro acerca de las entradas de archivo (no interrumpidas, de una fuente automatizada, etc.) probablemente pueda utilizar 'fgetscsv' – Florian

14

SPL significa Standard PHP Library.

SplFileObject usa internamente el recurso de flujo creado con fopen. ¿Entonces su pregunta debería ser cuándo es interesante utilizar SplFileObject o trabajar directamente con un recurso de flujo?

SplFileObject pros:

  • SplFileObject proporcionar un enfoque OOP para presentar manipulación (fread se añadió en PHP 5.5.11, fputcsv se añadió en PHP 5.4).

  • SplFileObject implementa varias interfaces PHP útiles para permitir el uso de otras SPL Iterator para manipular mejor su archivo.

SplFileObject principal desventaja es que no permite el acceso a su recurso de secuencia interna . Las funciones de PHP se construyeron originalmente para trabajar directamente con un recurso de flujo. El hecho de que el SplFileObject no da acceso a su propio recurso de secuencia interna que sea inutilizable con muchas PHP construido en funciones:

  • php stream filters uso es pobre, con SplFileObject.Debe confiar en el envoltorio de meta php://filter, que limita su utilidad.

  • usando SplFileObject con cURL no es posible

para resumir, y un recurso SplFileObject corriente no son intercambiables. Cualquier cosa hecha usando SplFileObject podría lograrse usando un recurso de flujo y una implementación de usuario de SplFileObject, pero el reverso no es verdadero.

Por lo tanto, dependiendo del caso de uso, utilizar un recurso de flujo creado por fopen puede ser una mejor opción que confiar en SplFileObject.

En cuanto al método de cierre, no necesita uno ... solo necesita establecer el controlador en nulo para liberar/cerrar el recurso de flujo interno.

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