Статьи

5 вещей, которые PHP завидует Java

PHP и Java имеют несколько разные модели исполнения, противопоставляя процессы без разделения ресурсов резидентным JVM. Но они также имеют много общего, как и их объектно-ориентированная модель.

Я видел, как многие программисты начинали думать, что Java старая и многословная, и пытались перейти на язык сценариев, таких как PHP и Ruby. Но это не так просто, так как эти языки опаздывают на вечеринку во многих областях. Вот 5 вещей, которым я, как программист PHP, завидовал Java.

Hibernate

Модели PHP, M из-за чрезмерно известной парадигмы MVC, все еще привязаны к базам данных, которые они используют для постоянства. В первом поколении PHP-фреймворков и ORM было принято работать только с Active Records внутри контроллеров. Даже сущности ассоциации (классы, такие как UserGroup или ArticleCategory), которые существуют только с целью зеркалирования таблицы базы данных, были распространены на базы кода приложений PHP.

Сейчас ситуация значительно улучшилась: Doctrine 2, которая заимствует Api у Hibernate, наверстывает упущенное. Он скрывает таблицы ассоциаций и ненужные направления ассоциаций, например, упрощая классы PHP, где это считается. Впечатляет, что это первая PHP ORM, которая не заставляет ваши сущности расширять базовый класс.

Но мы все еще на втором месте: например, в Doctrine 2 отсутствует поддержка отображения объектов-значений в текущей версии. Объекты Doctrine 2 на самом деле не связаны с базой данных, но реляционная модель, создаваемая отображением, является лишь зеркалом объектной модели.

По крайней мере, теперь у нас есть абстракция доменной модели в памяти для работы. Другим примером того, что мы больше не завидуем, является класс PreparedStatement. Когда-то мы работали с mysql_query () и SQL, составленными путем конкатенации, но теперь у нас есть PDO. PDO является эквивалентом JDBC, с общим Api для каждого поставщика базы данных.

Дженерики

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

Каждый раз, когда мы манипулируем массивом с помощью PHP, мы забываем о проверке типов ключей и значений. Это просто массив: он может иметь 4 объекта MyClass, а затем 5 — это строка.

В Java есть обобщения, но часто эта система типов мешает: вы можете захотеть просто передавать массивы или DTO-подобные структуры данных в «универсальном» слое, таком как приложение или представление, и вы вынуждены делать приведения. , Там, где нам нужны дженерики, мы просто опускаем строгую проверку типов :

<?phpfunction printList(array $listOfObjects){    foreach ($listOfObjects as $object) {        // $object could be anything, and getName() may not exist on it. It can even be TRUE or 0        echo (string) $object->getName(), "\n";    }}

На самом деле это не проблема, и в динамических языках обычно нет проверки типов. Но, время от времени, $ object будет иметь значение NULL, и скрипт умрет с фатальной ошибкой.

Хранение объектов в памяти между запросами

Хранить объекты в памяти легко в Java, хотя переменные сеанса как в PHP, так и в Java сериализуются, вы можете хранить объекты в базе данных в памяти, пока они находятся вне сервлетов, даже между HTTP-запросами (не стесняйтесь добавлять комментарии к этот.)

Например, Роман Борщел (который начал Doctrine 2) сказал, что он безвредно поддерживает EntityManager (Facade of Hibernate) открытым между запросами, только для того, чтобы зафиксировать постоянную модификацию базы данных в последнем HTTP-запросе. Это немного выходит за рамки парадигмы HTTP без сохранения состояния, но это определенно удобно, когда у вас есть действие, состоящее из нескольких шагов и запросов .

Java Collection Framework

Нам нужен набор, список, карта. Я не могу сказать вам, сколько раз я обернул array () в классе.

Ассоциативный массив, «хлеб с маслом» (и клей) кода PHP, является своего рода картой, но допускает только скаляр для ключей. Та же самая конструкция массива также является списком при использовании с числовыми ключами, но без метода contains () или какого-либо другого метода вообще, поскольку она не является объектом. В языке нет встроенного эквивалента Set.

Doctrine2, наш лидер orm, даже сам предоставляет класс Collection в пакете Doctrine \ Common.

Асинхронная обработка

Допустим, вы хотите выполнять действие, например, тяжелый запрос UPDATE в базе данных, в 14:00 каждый день. В PHP нам нужна внешняя программа cron , чтобы сказать нам, чтобы запустить эту задачу в нужное время . Из-за популярности общего хостинга, где у программиста нет доступа к общему crontab, был изобретен обходной путь, подобный Poormanscron , который проверяет при каждом запросе, подходит ли время для какой-то работы.

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

Выводы

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

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