В чем основные отличия между PHP и Java, которые кто-то владеет 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
Равенство на объектах (не на примитивных типах) проверяет идентичность объекта. Таким образом, следующее неинтуитивно печатает ложь. Строки имеют метод равенства, чтобы справиться с этим.
//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){
println("True");
}
else{
println("False");
}
Массивы - это ваши классические Си-массивы. Может содержать только переменные одного определенного типа, должны быть созданы с фиксированной длиной
Чтобы обойти это, существует ряд коллекционных объектов, один из которых называется ArrayList, который будет действовать больше как PHP-массивы (хотя бизнес с одним типом удержаний по-прежнему верен). Вы не получаете массив как синтаксис, все манипуляции выполняются с помощью методов
//creates an array list of strings
ArrayList<String> myArr = new ArrayList<String>();
myArr.add("My First Item");
ArrayLists по-прежнему имеют числовые ключи. Есть еще одна коллекция под названием HashMap, которая даст вам словарь (или ассоциативный массив, если вы ходили в школу в 90-х годах) как объект.
ArrayLists и другие коллекции реализованы с помощью так называемых обобщений (<String>). Я не программист на Java, поэтому все, что я понимаю о Generics, это то, что они описывают тип вещи, с которой будет работать объект. Там происходит гораздо больше.
У Java нет указателей. Тем не менее, все Объекты на самом деле являются ссылками, похожими на PHP 5, отличными от PHP 4. Я не думаю, что в Java есть (не рекомендуется) PHP, а также ссылки и синтаксис.
Все параметры метода передаются по значению в 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 предоставляет механизм для реализации потоков. У 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-приложения создаются по принципу "запустить, обработать запрос, остановить выполнение".
Я думаю, что эти два языка (а также их системы времени исполнения) слишком отличаются, чтобы перечислить все различия. Некоторые действительно большие, которые приходят мне в голову:
Вы заметите большинство различий, когда придет время, но самое главное:
===
и !==
. Явное неявное преобразование типов в основном ограничивается автоматическим боксированием примитивных типов (у PHP нет примитивных типов). Это часто возникает.Рассмотрим:
$val = 'a';
if (strpos('abcdefghij', $val)) {
// do stuff
}
который является неправильным, и блок не будет выполнен, потому что индекс возврата 0
преобразуется в false
. Правильная версия:
$val = 'a';
if (strpos('abcdefghij', $val) !== false) {
// do stuff
}
Условные операторы Java требуют явного выражения boolean
;
$
и в противном случае неразличимы;Maps
(например, HashMap
). Ассоциативные массивы упорядочиваются по порядку вставки и могут использоваться как обычные массивы (по значениям). Одна реализация Map
, которая поддерживает порядок вставки в Java, но это скорее исключение, чем норма;$arr['foo'] = 'bar'
вставить или обновить элемент в ассоциативном массиве. Java должна использовать Map.put()
и Map.get()
;create_function()
); 5.3 вводит замыкания на уровне языка. Java должен использовать внутренние классы для обоих, что несколько более подробно. Более того, внутренние классы ограничены в том, как они могут обращаться к переменным из внешней области (читайте Java Closures на 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 на мобильных телефонах:) Существует множество сред и платформ времени выполнения. Это означает, что вам нужно заранее подумать, какие библиотеки там могут отсутствовать или какие ограничения могут быть (размер экрана, ограничения памяти, ограничитель пути к файлу "/" или "\", например).