Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Не исчерпывающий список, и я разработчик 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-приложения создаются по принципу "запустить, обработать запрос, остановить выполнение".

Ответ 2

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

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

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

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

Ответ 3

  • Java строго типизирована. PHP не:
  • PHP делает много неявного преобразования типов, что может быть проблематичным, и поэтому PHP5 имеет такие операторы, как === и !==. Явное неявное преобразование типов в основном ограничивается автоматическим боксированием примитивных типов (у 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 нет. В Java это реализовано с использованием перегрузки методов.
  • PHP поддерживает шаблон missing-method, который смутно называется " перегрузка" в документах 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();
  • и, несомненно, больше, но это все, что приходит на ум сейчас.

Ответ 4

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

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