Почему PHP не использует объекты в своих библиотеках по умолчанию? - PullRequest
4 голосов
/ 23 февраля 2012

Я пишу на PHP чуть более полугода, и, хотя мне еще далеко до того, чтобы быть экспертом, я могу довольно легко обойтись и создавать сценарии для всего, что мне нужно.Я пришел из объектно-ориентированного фона, и это то, что PHP, похоже, использует очень мало, если вообще использует, в своих библиотеках по умолчанию.


Большинство внешних библиотек, которые я использую или создаю, работают с объектно-ориентированным дизайном, тогда как значения по умолчанию, похоже, используют следующий пример.Я буду использовать процесс чтения файла / записи в качестве примера:

$file_path = "/path/to/file.txt";
$file_handle = fopen($file_path, "w+");
$content = fread($file_handle, filesize($file_path));
fclose($file_handle);

Теперь для меня было бы более разумно использовать дизайн, который выглядит примерно так:

$file_handle = new FileStream("/path/to/file.txt");
$content = $file_handle->read();
$file_handle->close();

Теперь я совершенно уверен, что за этим будут определенные аргументы, поскольку эта же идея применяется к строкам, массивам, cURL, запросам MySQL и т. Д. Мне было бы интересно узнать, что это такое.

Итак, если лучше написать отдельные функции, использующие дескриптор или ресурс в качестве первого параметра, например,

object_method($handle, $value);

Тогда почему большинство популярных (внешних) библиотек PHP предпочитают использовать:

$object->method($value);

А что я должен использовать при написании своих собственных библиотек и приложений?

Ответы [ 6 ]

2 голосов
/ 23 февраля 2012

Это потому, что не было объектов, когда PHP был впервые написан. Существует ряд библиотек, которые объединяют основные функции PHP с ОО. Так же, как MFC оборачивает базовый C Windows API с классами C ++.

Если вы используете фреймворк, такой как Kohana, он предоставляет множество таких упаковщиков, как File Wrapper http://kohanaframework.org/3.0/guide/api/File

Вот полный API Коханы http://kohanaframework.org/3.0/guide/api/

1 голос
/ 23 февраля 2012

Хорошо, я не эксперт в этом, но я все равно собираюсь предложить свои $ .02 спекуляции:

PHP и веб-разработка в целом - это относительно новая парадигма. На чем основан C #, 40 лет работы? PHP начался в 1995 году.

PHP может быть полностью автономным, но программирование для веб-сервера - это естественная процедурная среда - сервер получает HTTP-запрос, подвергается некоторой обработке, отвечает. Вы можете абстрагироваться от этого, но разве это хорошая идея все время?

Многие задачи в среде веб-сервера на самом деле не требуют ОО - это хорошо в больших проектах, но сколько тысяч сайтов просто используют несколько функций обработки строк и включают ()? Может почта ()?

PHP создан для быстрой работы на легких серверах с упором на обработку строк, а не на сложную математику и тому подобное. Не цитируйте меня, но я думаю, что вы можете понести некоторые издержки производительности, если вы пошли строго OO с базовыми классами.

В любом случае, я не эксперт, но я так думаю об этом :) По крайней мере, пища для размышлений.

1 голос
/ 23 февраля 2012

Даже я могу понять часть вашего вопроса, пример, который вы приводите, на самом деле немного вводит в заблуждение, потому что эта часть является объектно-ориентированной в PHP, см. SplFileObject и друзья:

$file = new SplFileObject("/path/to/file.txt");
$content = '';
foreach ($file as $line)
  $content .= $line;

Это больше похоже на все SPL , DOMDocument , DateTime , Intl , PDO и т. Д.и пр.

1 голос
/ 23 февраля 2012

PHP изначально был написан как простой способ добавления динамического текста к HTML-страницам, а не формально хорошо определенный ОО-язык.До php 5 OO был очень ограничен.Zend (создатели и сопровождающие php) хотят обеспечить высокую степень обратной совместимости, поскольку большая часть сети работает на php.

Все больше и больше функциональности получает официальные классы оболочки OO с каждым новым выпуском, некоторые через дополнения pecl или pear.Хорошей практикой является использование OO-версии, когда это возможно.

Я сомневаюсь, что мы когда-нибудь увидим 100% OO php до такой степени, как Java.

1 голос
/ 23 февраля 2012

До недавнего времени PHP не был языком ООП.

real ООП появился только в v5.x; все старые функции оставлены по причинам обратной совместимости, и зачем изобретать что-то новое, когда старое работает хорошо?

Тем не менее, для некоторых библиотек существуют альтернативы ООП; например есть библиотека PDO , которая заменяет устаревшую библиотеку в стиле процедуры mysql.

0 голосов
/ 23 февраля 2012

Я уверен, что обратная совместимость где-нибудь войдет в уравнение.Даже если разработчики ядра php признали свою «ошибку» , отменить ее очень сложно, поскольку PHP широко применяется.Функции даты и классы DateTime являются хорошим примером того, как PHP пытается улучшить его использование, не нарушая пути обновления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...