Каковы различия между PHP и Java?

В чем основные отличия между PHP и Java, которые кто-то знает в PHP, но об обучении Java должен знать?

Изменить: я имею в виду различия в синтаксисе языков, т. Е. Их типы данных, как они обрабатывают массивы и ссылочные переменные и т. Д. 🙂

Не исчерпывающий список, и я разработчик PHP, который некоторое время путешествовал по Java, так что Caveat Emptor.

Каждая переменная в Java должна быть добавлена ​​с типом данных. Сюда входят примитивные типы, такие как boolean, int, double и char, а также типы данных Object, такие как ArrayList, String и ваши собственные объекты

int foo = 36; char bar = 'b'; double baz = 3.14; String speech = "We hold these truths ..."; MyWidget widget = new MyWidget(foo,bar,baz,speech); 

Каждая переменная может содержать только значение своего типа. Используя приведенные выше объявления, недопустимо следующее:

 foo = baz 

Равенство над объектами (а не примитивными типами) проверяет идентичность объекта. Таким образом, следующая неинтуитивно печатает false. Строки имеют метод равенства, чтобы справиться с этим.

 //see comments for more information on what happens //if you use this syntax to declare your strings //String v1 = "foo"; //String v2 = "foo"; String v1 = new String("foo"); String v2 = new String("foo"); if(v1 == v2){ pritnln("True"); } else{ println("False"); } 

Массивы – это ваши классические массивы C. Может содержать только переменные одного типа, необходимо создать фиксированную длину


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

 //creates an array list of strings ArrayList<String> myArr = new ArrayList<String>(); myArr.add("My First Item"); 

У ArrayLists все еще есть цифровые клавиши. Есть еще одна коллекция под названием HashMap, которая даст вам словарь (или ассоциативный массив, если вы отправитесь в школу в 90-е годы), как объект.


ArrayLists и другие коллекции реализованы с помощью так называемых generics (<String>). Я не программист на Java, поэтому все, что я понимаю о Generics, это описание того типа вещей, на котором будет работать объект. Там происходит гораздо больше.


Java не имеет указателей. Тем не менее, все объекты на самом деле являются ссылками, аналогичными PHP 5, по сравнению с PHP 4. Я не думаю, что Java имеет (обесцененный) PHP & reference & syntax.


Все параметры метода передаются по значению в Java. Однако, поскольку все объекты фактически являются ссылками, вы передаете значение ссылки при передаче объекта. Это означает, что если вы манипулируете объектом, переданным в метод, будут действовать манипуляции. Однако, если вы попробуете что-то подобное, вы не получите ожидаемого результата

 public void swapThatWontWork(String v1, String v2) { String temp = var1; var1 = var2; var2 = temp; } 

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

 public int fooBarBax(int v1){ } 

Если метод генерирует исключение, вы должны объявить его как таковой, или компилятор не будет иметь к этому никакого отношения.

 public int fooBarBax(int v1) throws SomeException,AnotherException{ ... } 

Это может оказаться сложным, если вы используете объекты, которые вы не указали в своем методе, которые могут вызвать исключение.


Основная точка ввода кода в Java будет методом класса, а не главной точкой входа в PHP


Имена переменных в Java не начинаются с сигилы ($), хотя я думаю, что они могут, если вы хотите, чтобы они


Имена классов в Java чувствительны к регистру.


Строки не изменяются в Java, поэтому конкатенация может быть дорогостоящей операцией.


Библиотека Java Class предоставляет механизм для реализации потоков. PHP не имеет такого механизма.


Методы PHP (и функции) позволяют вам иметь необязательные параметры. В java вам нужно определить отдельный метод для каждого возможного списка параметров

 public function inPHP($var1, $var2='foo'){} public void function inJava($var1){ $var2 = "foo"; inJava($var1,$var2); } public void function inJava($var1,$var2){ } 

PHP требует явного $ this, который будет использоваться, когда объект вызывает свои методы методов. Java (как видно из приведенного выше примера).


Программы Java, как правило, создаются из «прогонов программ, остается запущенными, обрабатывает запросы», в том числе, когда PHP-приложения построены на основе «запуска, обработки запроса, прекращения работы».

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

  • Java компилируется в байт-код, PHP интерпретируется (как отметил Алан Шторм, поскольку PHP 4, это не так, но он все еще ведет себя так, как если бы это было);
  • Java сильная и статически типизированная, а PHP довольно слабо и динамически типизирована;
  • PHP в основном используется для динамического создания веб-страниц. Java тоже может это сделать, но может делать что-нибудь еще (например, Applets, программное обеспечение для мобильных телефонов, материалы для предприятий, настольные приложения с графическим интерфейсом и без него, 3D-игры, Google Web Toolkit …); а также
  • добавьте свое любимое различие здесь

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

  • PHP предлагает OOP (объектно-ориентированное программирование) в качестве опции, которая игнорируется в большинстве проектов. Java требует, чтобы вы программировали способ ООП, но, изучая Java с фоном на не-ООП-языке, очень легко повредить вещи и использовать ООП неправильно (или вы можете назвать это субоптимальным способом или неэффективным способом …).
  • Java строго типизирована. PHP не является;
  • PHP делает много неявного преобразования типов, что может быть проблематичным, и поэтому PHP5 имеет такие операторы, как === и !== . Неявное преобразование типа Java в основном ограничивается автоматическим боксированием примитивных типов (у PHP нет примитивных типов). Это часто возникает.

Рассматривать:

 $val = 'a'; if (strpos('abcdefghij', $val)) { // do stuff } 

который является неправильным и будет заблокирован, потому что индекс возврата 0 преобразуется в значение false . Правильная версия:

 $val = 'a'; if (strpos('abcdefghij', $val) !== false) { // do stuff } 

Операторы условных выражений Java требуют явного boolean ;

  • PHP-переменные и массивы все добавляются в $ и в противном случае неразличимы;
  • Эквивалентом ассоциативных массивов PHP является PHP Maps (например, HashMap ). Ассоциативные массивы упорядочиваются по порядку вставки и могут использоваться как обычные массивы (по значениям). Theres одна реализация Map которая поддерживает порядок вставки в Java, но это скорее исключение, чем норма;
  • $arr['foo'] = 'bar' вставить или обновить элемент в ассоциативном массиве. Java должен использовать Map.put() и Map.get() ;
  • PHP5 имеет эквивалент указателей на функции и анонимных функций (с использованием create_function() ); 5.3 вводит замыкания на уровне языка. Java должен использовать внутренние классы для обоих, что несколько более подробно. Более того, внутренние классы ограничены в том, как они могут обращаться к переменным из внешней области (читать Java Closures on JavaPapers), делая их не такими мощными, как истинные закрытия.
  • Объявление переменной необязательно в PHP;
  • Использование глобальных переменных внутри функций требует явного использования ключевого слова global в PHP;
  • Параметры POST / GET, если они не настроены иначе ( register_globals() ), автоматически приводят к глобальным переменным с тем же именем. К ним также можно обращаться через глобальную переменную $_POST$_SESSION для переменных сеанса), тогда как поддержка этих вещей происходит из надстройки JEE, называемой API сервлетов, с помощью таких объектов, как HttpServletRequest и HttpSession ;
  • Объявление функции в PHP использует ключевое слово function тогда как в Java вы объявляете типы возвращаемых данных и типы параметров;
  • Имена имен PHP не могут нормально сталкиваться, тогда как Java допускает перегрузку метода, если разные сигнатуры методов не являются двусмысленными;
  • PHP имеет значения по умолчанию для аргументов функции. Java нет. В Java это реализовано с использованием перегрузки методов.
  • PHP поддерживает шаблон недостающих методов , который смутно называют « перегрузкой » в документах PHP.

Для сравнения:

 function do_stuff($name = 'Foo') { // ... } 

в

 void doStuff() { doStuff("Foo"); } void doStuff(String what) { // ... } 
  • Строковые константы в PHP объявляются с использованием одиночных или двойных кавычек, как и Perl. Двойные кавычки будут оценивать переменные, встроенные в текст. Все константы Java String используют двойные кавычки и не имеют такой переменной оценки;
  • Вызов метода объекта PHP использует оператор -> . Java использует . оператор;
  • Конструкторы в Java называются после имени класса. В PHP они называются __construct() ;
  • В объектах Java this неявно и используется только для явного представления о сфере видимости, а в некоторых случаях – для внутренних классов. В PHP5, $this явно;
  • Статические методы в Java можно вызвать либо с помощью . оператора на экземпляре (хотя это не рекомендуется, оно синтаксически корректно), но обычно вместо этого используется имя класса.

Эти два эквивалента:

 float f = 9.35f; String s1 = String.valueOf(f); String s2 = "My name is Earl".valueOf(f); 

но первый является предпочтительным. PHP использует оператор разрешения области видимости для статики;

  • Переопределение и перегрузка метода вполне естественна в Java, но это немного путаница в PHP;
  • PHP-код встроен в то, что в значительной степени является документом HTML, подобно тому, как работают JSP;
  • PHP использует . оператора для добавления строк. Java использует + ;
  • Методы Java 5+ должны использовать эллипсис ( ... ), чтобы явно объявлять списки аргументов переменной длины. Все функции PHP – это переменная длина;
  • Списки аргументов переменной длины рассматриваются как массивы внутри тел метода. В PHP вы должны использовать func_get_args() , func_get_arg() и / или func_num_args() ;
  • и, несомненно, больше, но это все, что приходит на ум сейчас.
  • вы можете использовать инструмент JavaDoc для автоматической генерации документации на вашем программном обеспечении. Но вам нужно писать комментарии определенным образом.

  • вы не можете запускать PHP на мобильных телефонах 🙂 Существует множество сред и платформ времени выполнения. Это означает, что вам нужно заранее подумать, какие библиотеки там могут отсутствовать или какие ограничения могут быть (размер экрана, ограничения памяти, разделитель пути к файлу «/» или «\», например).