Отказ от ответственности: я не хочу начинать религиозную войну между Java и PHP. Вы знаете старую поговорку, что мы должны время от времени изучать новый язык программирования? Цель состоит в том, чтобы получить новую перспективу и собрать новые идеи, которые мы можем использовать на нашей предпочтительной платформе. Каждый язык может научить нас чему-то новому, даже если Java уже является стандартом для обучения программистов.
Сравнение только для веб-приложений и динамических веб-сайтов, так как PHP не конкурирует на десктопе. Я программист PHP, но я работаю на Java над университетскими проектами. Если вы заметили, что чего-то не хватает в сравнениях в этом списке, не стесняйтесь комментировать и завершать мое описание функций Java, а также PHP.
Давайте начнем.
Вы не можете производить утечки памяти
Окружающая среда без участия может иногда быть помехой, но она определенно помогает для производительности и надежности. Все в PHP закрывается и уничтожается в конце скрипта: даже если библиотека или ресурс, который вы не можете избежать, теряет память, как будто завтра не будет, эта память будет освобождена в конце скрипта. Кстати, есть также директива memory_limit на случай, если скрипт выполняет что-то тяжелое, например, заполнение базы данных.
Даже в случае бесконечной рекурсии происходит сбой сегментации в текущем процессе, который завершается сбоем. Следующий запрос может быть выполнен без проблем, как будто ничего не произошло. Отсутствие состояния приложения означает, что оно не может быть оставлено в неловком состоянии, и, как утверждают некоторые вдумчивые комментаторы в комментариях к предыдущей статье, нет необходимости в блокировках и синхронизации. Многопоточность в PHP — это просто использование нескольких скриптов (асинхронность должна управляться из скрипта).
Компиляция не требуется
Я знаю, IDE позаботятся обо всем, и когда вы нажмете любую клавишу, они просто перекомпилируют все устаревшее. Тем не менее, в PHP нет этапа компиляции, требуемого программистом, и, например, вы запускаете тесты для включенных исходных файлов. Библиотеки поставляются как исходный код, и когда они терпят неудачу, это занимает считанные секунды, чтобы перейти к конкретной строке, которая генерирует ошибку.
Отсутствие явной компиляции не означает, что нет никаких проверок во время компиляции: каждый сценарий компилируется за время до выполнения, а коды операций (эквивалент байт-кода) могут кэшироваться в производственных средах. Таким образом, скрипт с ошибками синтаксиса не может быть выполнен вообще; класс, расширяющий несуществующий родительский класс, не может быть определен. И так далее. Без явной компиляции на один шаг меньше в тестировании, CI и развертывании (если только вы не Facebook и не изобрели HipHop). Насколько я знаю, компиляторы Java JIT переходят от байт-кода к нативному коду, но они не начинаются с исходного кода.
Единая платформа
Выбор, как правило, хорош для разработчиков, но альтернативные реализации не должны именоваться с одинаковым именем пакета и класса .
Например, когда я работал с OSGi, я обнаружил, что проблема с отображением пробок была вызвана использованием пакета org.w3c.dom, который отличался от ожидаемого, поскольку Xerces хотел использовать свой собственный org.w3c.dom. .Документ, отличный от того, который включен в JVM.
Я никогда не видел повторяющихся имен классов в коде PHP, даже до того, как были введены пространства имен. Возможно, масштаб объектно-ориентированного кода в PHP не настолько велик, чтобы вызывать такие конфликты, но когда вы создаете экземпляр класса, вы точно знаете, на какой код ссылаетесь; и его исходный код всегда доступен для проверки при сбое абстракции.
База данных (и более) батареи включены
Каждый поддерживаемый драйвер реляционной базы данных обычно включен и поставляется с двоичным пакетом PHP. Вы можете отключить загрузку расширений, которые вы не используете, но включение MySQL или Postgres для PDO обычно сводится к удалению комментария в php.ini. Нет файлов для загрузки или выбора с Maven во время сборки, нет несовместимости нескольких версий.
И дело не только в общении с базой данных. Просто попробуйте прочитать файл :
File file = new File("C:\\MyFile.txt");
FileInputStream fis = null;
BufferedInputStream bis = null;
DataInputStream dis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
dis = new DataInputStream(bis);
while (dis.available() != 0) {
System.out.println(dis.readLine());
}
fis.close();
bis.close();
dis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
сравнить с
<?php echo file_get_contents('MyFile.txt'); ?>
Я знаю, что есть Apache Commons , но мне нужно загружать и связывать внешнюю библиотеку только для чтения файла?
Я знаю также, что на решение PHP может повлиять производительность, но у нас есть fread () и аналогичные функции, если вы действительно хотите читать в блоках.
Давайте попробуем с XML-файлом:
try {
File file = new File("c:\\MyXMLFile.xml");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(file);
doc.getDocumentElement().normalize();
NodeList nodeLst = doc.getElementsByTagName("employee");
for (int s = 0; s < nodeLst.getLength(); s++) {
Node fstNode = nodeLst.item(s);
if (fstNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element) fstNode;
NodeList fstNmElmntLst = fstElmnt.getElementsByTagName("firstname");
Element fstNmElmnt = (Element) fstNmElmntLst.item(0);
NodeList fstNm = fstNmElmnt.getChildNodes();
System.out.println("First Name : " + ((Node) fstNm.item(0)).getNodeValue());
}
}
} catch (Exception e) {
e.printStackTrace();
}
сравнить с:
<?php
$xml = simplexml_load_file('MyXMLFile.xml');
foreach ($xml->employee as $e) {
echo "First name: ", $e->firstname, "\n";
}
Опять встроено в язык . Давайте пропустим JSON …
Общий хостинг
Общий хостинг — это горько-сладкая характеристика PHP. Это дешево : в Италии вы можете получить хост с 4 базами данных MySQL менее чем за 10 евро, а также бесплатно, если вы принимаете поддомен (цены растут с необходимыми характеристиками, технической поддержкой и услугами, такими как SSH). Деньги в основном покрывают регистрацию доменного имени. Одна и та же машина может поддерживать множество веб-сайтов, поскольку ничего не выполняется, пока пользователь не запросит страницу.
Его легко развернуть : ему нужен только экземпляр phpMyAdmin для управления базой данных через браузер и некоторый механизм передачи файлов (в прежние времена FTP, но также svn или git, если есть доступ к оболочке). Нулевая конфигурация, внешняя по отношению к вашему собственному приложению и базе данных: получив сборку, вы можете просто поместить ее в нужную папку или изменить символическую ссылку.
Барьер для входа очень низок, что означает, что средний программист PHP не прочитал бы все статьи Дейкстры. PHP часто воспринимается как игрушечный язык из-за результатов, полученных бюджетными сегментами программистов, но виртуальный хостинг является одним из ключевых моментов популярности PHP.