Каковы различия между PHP и Java? - PullRequest
23 голосов
/ 04 января 2009

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

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

Ответы [ 4 ]

46 голосов
/ 04 января 2009

Не исчерпывающий список, и я разработчик 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");
}

Массивы - это ваши классические 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 & reference & синтаксис.


Все параметры метода передаются по значению в 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-приложения создаются с помощью метода «запустить, обработать запрос, остановить выполнение».

14 голосов
/ 04 января 2009

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

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

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

  • PHP предлагает ООП (объектно-ориентированное программирование) в качестве опции, которая игнорируется в большинстве проектов. Java требует, чтобы вы программировали путь ООП, но при изучении Java с фоном на не очень ООП-языке действительно легко все испортить и использовать ООП неправильно (или вы можете назвать это неоптимальным способом). или неэффективным способом ...).
6 голосов
/ 05 января 2009
  • 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). Ассоциативные массивы упорядочены по порядку вставки и могут использоваться как обычные массивы (для значений). Существует одна реализация 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 это реализовано с использованием перегрузки метода.
  • PHP поддерживает шаблон missing-method , который в документации PHP вызывает путаницу " overloading ".

Сравните:

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();
  • и, несомненно, больше, но это все, что сейчас приходит на ум.
1 голос
/ 05 января 2009
  • вы можете использовать JavaDoc инструмент для автоматического создания документации по вашему программному обеспечению. Но вы должны написать комментарии определенным образом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...