В чем основные отличия между 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 нет примитивных типов). Это часто возникает. Рассматривать:
$val = 'a'; if (strpos('abcdefghij', $val)) { // do stuff }
который является неправильным и будет заблокирован, потому что индекс возврата 0
преобразуется в значение false
. Правильная версия:
$val = 'a'; if (strpos('abcdefghij', $val) !== false) { // do stuff }
Операторы условных выражений Java требуют явного boolean
;
$
и в противном случае неразличимы; Maps
(например, HashMap
). Ассоциативные массивы упорядочиваются по порядку вставки и могут использоваться как обычные массивы (по значениям). Theres одна реализация Map
которая поддерживает порядок вставки в Java, но это скорее исключение, чем норма; $arr['foo'] = 'bar'
вставить или обновить элемент в ассоциативном массиве. Java должен использовать Map.put()
и Map.get()
; create_function()
); 5.3 вводит замыкания на уровне языка. Java должен использовать внутренние классы для обоих, что несколько более подробно. Более того, внутренние классы ограничены в том, как они могут обращаться к переменным из внешней области (читать Java Closures on JavaPapers), делая их не такими мощными, как истинные закрытия. global
в PHP; register_globals()
), автоматически приводят к глобальным переменным с тем же именем. К ним также можно обращаться через глобальную переменную $_POST
(и $_SESSION
для переменных сеанса), тогда как поддержка этих вещей происходит из надстройки JEE, называемой API сервлетов, с помощью таких объектов, как HttpServletRequest
и HttpSession
; function
тогда как в Java вы объявляете типы возвращаемых данных и типы параметров; Для сравнения:
function do_stuff($name = 'Foo') { // ... }
в
void doStuff() { doStuff("Foo"); } void doStuff(String what) { // ... }
->
. Java использует .
оператор; __construct()
; this
неявно и используется только для явного представления о сфере видимости, а в некоторых случаях – для внутренних классов. В PHP5, $this
явно; .
оператора на экземпляре (хотя это не рекомендуется, оно синтаксически корректно), но обычно вместо этого используется имя класса. Эти два эквивалента:
float f = 9.35f; String s1 = String.valueOf(f); String s2 = "My name is Earl".valueOf(f);
но первый является предпочтительным. PHP использует оператор разрешения области видимости для статики;
.
оператора для добавления строк. Java использует +
; ...
), чтобы явно объявлять списки аргументов переменной длины. Все функции PHP – это переменная длина; func_get_args()
, func_get_arg()
и / или func_num_args()
; вы можете использовать инструмент JavaDoc для автоматической генерации документации на вашем программном обеспечении. Но вам нужно писать комментарии определенным образом.
вы не можете запускать PHP на мобильных телефонах 🙂 Существует множество сред и платформ времени выполнения. Это означает, что вам нужно заранее подумать, какие библиотеки там могут отсутствовать или какие ограничения могут быть (размер экрана, ограничения памяти, разделитель пути к файлу «/» или «\», например).