2009-01-04 18 views
22

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

Edit: Я имею в виду различия в синтаксисе языка, т.е. их типы данных, как они обрабатывать массивы & ссылочные переменные и так далее :)

+2

Как вы можете начать отвечать на этот вопрос? Это похоже на вопрос: «В чем разница между испанским и португальским?» –

ответ

45

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

Каждая переменная в Java должна быть добавлена ​​с типом данных. Это включает в себя примитивные типы, такие как логическое значение, INT, двойной и полукокса, а также объектов типы данных, такие как 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 и другие коллекции реализованы с чем-то называется дженерик (< Струнных >). Я не программист на 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 будут методами класса, в отличие от ПГПСА основного глобальной точки входа


имена переменного в 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 требует явного $ это можно использовать, когда объект вызывает собственные методы методы. Java (как видно из приведенного выше примера).


Java программа, как правило, построена из «программы работает, продолжает работать, обрабатывают запросы» вид пути, где, как PHP приложение построены из «Беги, обрабатывать запрос, прекращать работу» вид пути ,

+0

Я не понимаю, что неинтуитивно относится к Строкам. В вашем примере «foo»! = «Bar» используется ли семантика по ссылке или по значению. – Alan

+0

Как и не должно быть. Оба струнных струны должны были быть одинаковыми, я слишком спешил. Спасибо, что поймал это. –

+2

В вашем первом примере равенства строк, v1 == v2 очень часто будет истинным. При создании объектов String с использованием синтаксического сахара Java для строк (String v1 = "foo") эти строки обычно интернированы, поэтому v1 == v2 будет ссылаться на один и тот же объект. OTOH, если у вас есть String v2 = new String ("foo"), – dancavallaro

14

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

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

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

  • PHP предлагает ООП (объектно-ориентированное программирование) в качестве опции что игнорируется в большинстве проектов. Java требует, чтобы вы программировали способ ООП, но, изучая Java с фоном на не-ООП-языке, очень легко повредить вещи и использовать ООП неправильно (или вы можете назвать это субоптимальным способом или неэффективным способом ...).
+0

, пожалуйста, просмотрите и уточните, если возможно :) –

+0

Должен признать, что мой опыт PHP слишком давно, чтобы дать разумный ответ на этот конкретный вопрос. Думаю, кто-то оставит ответ. –

+0

Просто заметите, что PHP не строго «интерпретируется». Начиная с PHP 4, при каждом запросе на PHP-страницу/скрипт парсер будет генерировать байт-код (часто называемый optcode), который затем выполняется Zend Engine. –

6
  • 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 на JavaPapers), делая их не такими мощными, как истинные закрытия.
  • Объявление переменной необязательно в PHP;
  • Использование глобальных переменных внутри функций требует явного использования ключевого слова global в PHP;
  • Параметры POST/GET, если они не настроены иначе (register_globals()), автоматически приводят к глобальным переменным с тем же именем.К ним также можно обратиться через глобальную переменную $_POST$_SESSION для переменных сеанса), тогда как поддержка этих вещей происходит из надстройки JEE, называемой API сервлетов, через объекты, такие как HttpServletRequest и HttpSession;
  • Объявление функции в PHP использует ключевое слово function, тогда как в Java вы объявляете типы возвращаемых данных и типы параметров;
  • Имена функций PHP обычно не могут возникать, тогда как Java допускает перегрузку метода, если разные сигнатуры методов не являются двусмысленными;
  • PHP имеет значения по умолчанию для аргументов функции. Java нет. В Java это реализовано с использованием перегрузки методов.
  • PHP поддерживает шаблон missing-method, который смутно называется «overloading» в документах 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();
  • и, без сомнения, больше, но это все, что приходит на ум сейчас.
+0

Не соглашаться или не соглашаться, но мне любопытно, что вы подразумеваете под «Переопределение и перегрузка метода вполне естественно в Java, но немного kludge в PHP «Если я что-то не упустил, оба языка разрешают ребенку объявлять новые методы для переопределения методов, существующих в родительском классе. –

+1

@Alan, да, но на PHP, если класс имеет две функции с тем же именем или там это 2 процедурные функции с тем же именем, вы получаете T_FUNCTION_EXISTS или что-то вроде этой ошибки –

1
  • можно использовать JavaDoc инструмент автоматического создания документации по программному обеспечению. Но вам нужно писать комментарии определенным образом.

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

+0

Вы можете использовать phpDocumentor phpdoc.org для того же самого с PHP. Некоторые мобильные телефоны имеют нестандартную версию Java. – OIS

Смежные вопросы