SplFileObject vs fopen в PHP

Каковы преимущества и недостатки использования fopen в отличие от SplFileObject в PHP?

Из того, что я вижу, SplFileObject выдает исключения, если это применимо, что делает это удобным при использовании try...catch для обработки ошибок. Кроме того, есть ли другие причины, чтобы рекомендовать друг друга?

(Бонус: почему он называется SplFileObject? Что означает Spl? Почему бы просто просто FileObject?)

Обновление: Одно из ограничений SplFileObject заключается в том, что он еще не имеет функции-члена close. В некоторых сценариях это может быть проблемой (пример: Unlink и SplFileObject).

Ответ 1

SPL означает стандартную библиотеку PHP.

SplFileObject использует внутренний ресурс потока, созданный с помощью fopen. Итак, ваш вопрос должен быть, когда интересно использовать SplFileObject или напрямую работать с ресурсом потока?

SplFileObject профи:

  • SplFileObject обеспечивают подход к управлению файлом OOP (fread был добавлен в PHP 5.5.11, fputcsv был добавлен в PHP 5.4).

  • SplFileObject реализует несколько полезных интерфейсов PHP, чтобы использовать другой SPL Iterator для лучшего управления вашим файлом.

SplFileObject Основной недостаток заключается в том, что он не дает доступа к его внутренний ресурс потока. Первоначально функции PHP были созданы для непосредственной работы с ресурсом потока. Тот факт, что SplFileObject не дает доступа к собственному внутреннему ресурсу потока, делает его непригодным для использования со многими встроенными функциями PHP:

  • Фильтры php-потоков плохо работают с SplFileObject. Вы должны полагаться на метатеку php://filter, которая ограничивает их полезность.

  • использование SplFileObject с cURL невозможно

Подводя итог SplFileObject, и ресурс потока не являются взаимозаменяемыми. Все, что сделано с помощью SplFileObject, может быть достигнуто с использованием ресурса потока и реализации пользовательской среды SplFileObject, но обратное неверно.

Таким образом, в зависимости от варианта использования ресурса потока, созданного fopen, может быть лучшим выбором, чем полагаться на SplFileObject.

Что касается метода close, вам не нужен один... вам просто нужно установить для обработчика значение null, чтобы освободить/закрыть ресурс внутреннего потока.

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

Ответ 2

Spl означает стандартную библиотеку PHP.

Основным преимуществом является ориентация объекта, которая более подходит для некоторых подходов (не для всего, то есть). Это хороший вариант, если вам необходимо предоставить классы для обработки файлов (как в пользовательских форматах и ​​т.д.), Так как вы можете наследовать от SplFileObject и иметь уже встроенную базовую функциональность.

Основной вопрос заключается в том, чего вы хотите достичь с помощью своего кода: вам нужно открыть один файл один раз, прочитать его данные, а затем работать с ним или вам нужно делать более сложные вещи с помощью одного (или даже более).

Ответ 3

Spl - стандартная библиотека в Php, создающая много приятных вещей.

Одна из веских причин использования SplFileObject заключается в том, что он делает ваш объект Object Oriented. Если вы хотите, вы можете расширить класс в своей собственной базе кода и сделать так, чтобы он делал некоторые приятные вещи при использовании файлов, с уже рассмотренными основами.