2012-08-07 11 views
11

Jakie są plusy i minusy używania fopen w przeciwieństwie do SplFileObject w PHP?SplFileObject vs fopen w PHP

Z tego, co widzę, SplFileObject zgłasza wyjątki tam, gdzie ma to zastosowanie, co sprawia, że ​​jest to wygodne, gdy używa się try...catch do obsługi błędów. Poza tym, czy są jakieś inne powody, by polecać się nawzajem?

(Bonus: Dlaczego to się nazywa SplFileObject Co Spl stojak na Dlaczego nie po prostu FileObject??)

Aktualizacja: Jedno ograniczenie SplFileObject jest to, że tak nie jest (jeszcze) mają człon close funkcjonować. W niektórych sytuacjach może to stanowić problem (na przykład: Unlink and SplFileObject).

+2

możesz chcieć użyć tutaj znacznika [spl]. kilka osób, które go śledzą, jest zazwyczaj bardzo entuzjastycznie nastawionych i posiada dużą wiedzę. – goat

+0

@rambocoder Zrobione –

Odpowiedz

1

Spl jest standardową biblioteką w PHP, która tworzy wiele fajnych rzeczy.

Jednym z ważnych powodów użycia SplFileObject jest to, że tworzy on kod Object Object Oriented. Jeśli chcesz, możesz rozszerzyć klasę we własnej bazie kodu i sprawić, że zrobi kilka fajnych rzeczy podczas korzystania z plików, z już podstawowymi tematami.

4

Spl oznacza standardową bibliotekę PHP.

Główną zaletą jest orientacja obiektowa, która jest bardziej odpowiednia dla niektórych podejść (nie dla wszystkiego). Jest to dobra opcja, jeśli musisz dostarczyć klasy do obsługi plików (jak w niestandardowych formatach itp.), Ponieważ możesz dziedziczyć po SplFileObject i mieć podstawową funkcjonalność już wbudowaną.

Główne pytanie tutaj brzmi, co chcesz osiągnąć za pomocą kodu - musisz otworzyć pojedynczy plik jeden raz, odczytać jego dane, a następnie pracować z nim lub robić bardziej skomplikowane czynności z jednym (lub nawet więcej) plikami.

+0

Mam jedną stronę w moim projekcie, do której ładuję plik CSV i zapełniam bazę danych. Używam 'try ... catch' na każdej stronie do obsługi błędów. Czy mam rację sądząc, że "SplFileObject" to dobry wybór? –

+2

Osobiście wolałbym to dla danych, które chcesz umieścić w bazie danych, ponieważ możesz zrobić dokładniejszą obsługę błędów, więc sam bym to zrobił w tym ogólnym ustawieniu, ponieważ chciałbym rejestrować błędy itp. Jednak , jeśli możesz być pewien co do plików wejściowych (nie zepsuty, z automatycznego źródła itp.) prawdopodobnie mógłbyś użyć 'fgetscsv' – Florian

14

SPL oznacza standardową bibliotekę PHP.

SplFileObject wykorzystuje wewnętrznie zasoby strumieniowe utworzone za pomocą fopen. Więc twoje pytanie powinno brzmieć, kiedy interesujące jest użycie SplFileObject lub bezpośredniej pracy z zasobem strumieniowym?

SplFileObject zalety:

  • SplFileObject zapewnienie podejścia OOP złożyć manipulacji (fread dodano PHP 5.5.11, fputcsv dodano PHP 5.4).

  • SplFileObject implementuje kilka użytecznych interfejsów PHP, aby umożliwić korzystanie z innych SPL Iterator, aby lepiej manipulować plikiem.

SplFileObject Główną wadą jest to, że nie daje dostęp do jej zasobów wewnętrznego strumienia. Funkcje PHP zostały pierwotnie zbudowane tak, aby bezpośrednio działały z zasobami strumieniowymi. Fakt, że SplFileObject nie daje dostęp do własnego zasobu strumienia wewnętrzne sprawiają, że nadaje się do użytku z wieloma PHP Wbudowane funkcje:

  • php stream filters użycie jest biedny z SplFileObject.Musisz polegać na meta wrapperie php://filter, co ogranicza ich użyteczność.

  • użyciu SplFileObject z cURL nie jest możliwe

Podsumowując SplFileObject i zasób strumień nie są wymienne. Wszystko, co zostało zrobione przy użyciu SplFileObject, można uzyskać przy użyciu zasobu strumienia i implementacji przestrzeni użytkownika SplFileObject, ale odwrócenie to nie jest prawdą.

Tak więc w zależności od przypadku użycia zasobów strumieniowych utworzonych przez fopen może być lepszym wyborem niż poleganie na SplFileObject.

Jeśli chodzi o metodę zamykania, nie jest wymagana jedna ... wystarczy ustawić handler na wartość null, aby zwolnić/zamknąć zasób strumienia wewnętrznego.

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