2009-01-04 32 views
22

¿Cuáles son las principales diferencias entre PHP y Java que alguien con dominio en PHP pero que aprende sobre Java debería conocer?¿Cuáles son las diferencias entre PHP y Java?

Editar: me refiero a las diferencias en la sintaxis de las lenguas, es decir, sus tipos de datos, la forma en que manejan matrices & variables de referencia, y así sucesivamente :)

+2

¿Cómo empiezas a responder esta pregunta? Es como preguntar: "¿Cuáles son las diferencias entre español y portugués?" –

Respuesta

45

No es una lista exhaustiva, y soy un desarrollador de PHP que hizo un recorrido por Java hace un tiempo así que Caveat Emptor.

Todas las variables en Java deben ir precedidas de un tipo de datos. Esto incluye tipos primitivos como boolean, int, doble y carbón, así como objetos de tipos de datos, tales como ArrayList, cuerdas, y sus propios objetos

int foo = 36; 
char bar = 'b'; 
double baz = 3.14; 
String speech = "We hold these truths ..."; 
MyWidget widget = new MyWidget(foo,bar,baz,speech); 

Cada variable sólo puede contener un valor de su tipo. Uso de las declaraciones anteriores, la siguiente no es válida

foo = baz 

igualdad en los objetos (no en los tipos primitivos) comprueba la identidad del objeto. Entonces, lo siguiente, de manera no intuitiva, imprime falso. Las cadenas tienen un método de igualdad para manejar esto.

//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"); 
} 

Las matrices son sus agrupaciones clásicas C. sólo puede contener las variables de un tipo particular, se deben crear con una longitud fija


Para evitar esto, hay una serie de objetos de colección, uno de ellos se llama ArrayList que actuará más como matrices de PHP (aunque el negocio de hold one type sigue siendo cierto).No obtiene la matriz como la sintaxis, toda la manipulación se realiza a través de métodos

//creates an array list of strings 
ArrayList<String> myArr = new ArrayList<String>(); 
myArr.add("My First Item"); 

ArrayLists todavía tienen teclas numéricas. Hay otra colección llamada HashMap que le dará un diccionario (o matriz asociativa, si fue a la escuela en los 90) como objeto.


ArrayLists y otras colecciones se implementan con algo llamado genéricos (el <Cuerda>). No soy un programador de Java, por lo que todo lo que entiendo sobre genéricos es que describen el tipo de cosas en las que operará un objeto. Hay mucho más pasando allí.


Java no tiene punteros. Sin embargo, todos los objetos son en realidad referencias, similares a PHP 5, disímiles a PHP 4. No hago creo que Java tiene la sintaxis de referencia & de &.


Todos los parámetros del método se pasan por valor en Java. Sin embargo, dado que todos los objetos son en realidad referencias, está pasando el valor de la referencia cuando pasa un objeto. Esto significa que si manipulas un objeto pasado a un método, las manipulaciones se mantendrán. Sin embargo, si intenta algo como esto, no obtendrá el resultado que espera

public void swapThatWontWork(String v1, String v2) 
{ 
    String temp = var1; 
    var1 = var2; 
    var2 = temp; 
} 

¡Es un momento tan bueno como cualquier otro para mencionar que los métodos necesitan tener su tipo de retorno especificado, y las cosas malas sucederá si un método devuelve algo que no debería. El siguiente método devuelve un int

public int fooBarBax(int v1){ 
} 

Si un método se va a lanzar una excepción, usted tiene que declarar como tal, o el compilador no tendrá nada que ver con ello.

public int fooBarBax(int v1) throws SomeException,AnotherException{ 
    ... 
} 

Esto puede ser complicado si utiliza objetos que no ha escrito en su método que podrían arrojar una excepción.


Usted principal punto de entrada de código en Java va a ser un método de una clase, en contraposición a los PHP principal punto de entrada global


Los nombres de variables en Java no comienzan con un sigilo ($) , aunque creo que pueden hacerlo si lo desea


Los nombres de las clases en Java distinguen entre mayúsculas y minúsculas.


Las cadenas no son mutables en Java, por lo que la concatenación puede ser una operación costosa.


La biblioteca Java Class proporciona un mecanismo para implementar subprocesos. PHP no tiene tal mecanismo.


Los métodos PHP (y funciones) le permiten tener parámetros opcionales. En Java, es necesario definir un método separado para cada posible lista de parámetros

public function inPHP($var1, $var2='foo'){} 

public void function inJava($var1){ 
    $var2 = "foo"; 
    inJava($var1,$var2); 
} 
public void function inJava($var1,$var2){ 

} 

PHP requiere un $ explícita esta usarse cuando un objeto llama a sus propios métodos de métodos. Java (como se ve en el ejemplo anterior) no.

programas

Java tienden a ser construido a partir de un "programa se ejecuta, se mantiene en funcionamiento, procesa las solicitudes de" tipo de camino, en tanto que las aplicaciones PHP se construyen a partir de una "corrida, gestionar la solicitud, deja de correr" tipo de camino .

+0

No entiendo lo que no es intuitivo sobre Strings. En su ejemplo, "foo"! = "Bar" si la semántica es por referencia o por valor. – Alan

+0

Además, no deberías haberlo hecho. Ambas cadenas de Vars deberían haber sido las mismas, estaba apresurando las cosas con demasiada prisa. Gracias por atrapar eso. –

+2

En su primer ejemplo de igualdad de cadenas, v1 == v2 muy a menudo será verdadero. Al crear objetos String utilizando el azúcar sintáctico de Java para cadenas (String v1 = "foo"), estas cadenas generalmente se internan, por lo que v1 == v2 se referirá al mismo objeto. OTOH, si tiene String v2 = new String ("foo"), – dancavallaro

14

Creo que estas dos lenguas (así como su sistemas de tiempo de ejecución) son demasiado diferentes para enumerar todas las diferencias. Algunos realmente grandes que vienen a mi cabeza:

  • Java es compilado a código de bytes, PHP se interpreta (como Alan Tormenta señaló, a partir de PHP 4, no lo es, pero todavía se comporta como si fuera);
  • Java es fuerte y tipado estáticamente, mientras que PHP está tipeado de forma débil y dinámica;
  • PHP se utiliza principalmente para generar dinámicamente páginas web. Java también puede hacer eso, pero también puede hacer cualquier otra cosa (como Applets, software para teléfonos móviles, material de Enterprise, aplicaciones de escritorio con y sin GUI, juegos 3D, Google Web Toolkit ...); y
  • añadir su diferencia favorito aquí

Se dará cuenta de la mayoría de las diferencias cuando es el momento para, pero lo que es más importante:

  • PHP ofrece programación orientada a objetos (programación orientada a objetos) como una opción eso es ignorado en la mayoría de los proyectos. Java requiere que programes el modo OOP, pero cuando aprendes Java con un fondo en un lenguaje que no es tan OOP, es muy fácil complicar las cosas y usar OOP de forma incorrecta (o puedes llamarlo de manera subóptima) o la forma ineficiente ...).
+0

por favor, vea editar y aclarar si es posible :) –

+0

Debo admitir que mi experiencia PHP fue demasiado antigua para dar una respuesta inteligente a esa pregunta específica. Supongo que alguien más dejará una respuesta. –

+0

Solo una nota rápida de que PHP no es estrictamente "interpretado". Desde PHP 4, en cada solicitud de una página/script PHP, el analizador generará bytecode (a menudo llamado optcode), que luego ejecuta Zend Engine. –

6
  • Java está fuertemente tipado. PHP no es;
  • PHP hace una gran cantidad de conversión de tipo implícita, lo que en realidad puede ser problemático y es por eso que PHP5 tiene operadores como === y !==. La conversión de tipo implícito de Java se limita principalmente al auto-boxeo de tipos primitivos (PHP no tiene tipos primitivos). Esto a menudo aparece.

considerar:

$val = 'a'; 
if (strpos('abcdefghij', $val)) { 
    // do stuff 
} 

que es incorrecta y tendrá el bloque no se ejecuta debido a que el índice de retorno de 0 se convierte en false. La versión correcta es:

$val = 'a'; 
if (strpos('abcdefghij', $val) !== false) { 
    // do stuff 
} 

sentencias condicionales Java requieren una explícita boolean;

  • Las variables y matrices de PHP están precedidas por $ y no se pueden distinguir;
  • El equivalente de matrices asociativas de PHP es PHP Maps (por ej. HashMap). Las matrices asociativas se ordenan en el orden de inserción y se pueden usar como matrices ordinarias (en los valores). Hay una implementación de Map que mantiene el orden de inserción en Java pero esta es la excepción más que la norma;
  • $arr['foo'] = 'bar' inserte o actualice un elemento en una matriz asociativa. Java debe usar Map.put() y Map.get();
  • PHP5 tiene el equivalente de punteros a funciones y funciones anónimas (usando create_function()); 5.3 introduce cierres en el nivel de idioma. Java debe usar clases internas para ambos, que es algo más detallado. Además, las clases internas están limitadas en cuanto a cómo pueden acceder a variables del ámbito externo (lea Java Closures en JavaPapers), lo que las hace menos potentes que los cierres verdaderos.
  • La declaración de la variable es opcional en PHP;
  • El uso de variables globales dentro de las funciones requiere el uso explícito de la palabra clave global en PHP;
  • Los parámetros POST/GET son, a menos que se configuren de otra manera (register_globals()), resultan automáticamente en variables globales del mismo nombre.Se puede acceder alternativamente a través de la variable global $_POST (y $_SESSION para variables de sesión), mientras que el soporte para estas cosas proviene de un complemento JEE llamado API de servlets a través de objetos como HttpServletRequest y HttpSession;
  • La declaración de función en PHP usa la palabra clave function, mientras que en Java declaras tipos de devolución y tipos de parámetros;
  • Los nombres de las funciones PHP normalmente no pueden entrar en conflicto, mientras que Java permite la sobrecarga de métodos siempre que las diferentes firmas de métodos no sean ambiguas;
  • PHP tiene valores predeterminados para los argumentos de funciones. Java no. En Java, esto se implementa utilizando la sobrecarga de métodos.
  • PHP admite el patrón missing-method, que se denomina confusamente "overloading" en los documentos de PHP.

Compare:

function do_stuff($name = 'Foo') { 
    // ... 
} 

a

void doStuff() { 
    doStuff("Foo"); 
} 

void doStuff(String what) { 
    // ... 
} 
  • Las constantes de cadena en PHP se declaran usando comillas simples o dobles, tal como perl. Las comillas dobles evaluarán las variables incrustadas en el texto. Todas las constantes de cadenas de Java usan comillas dobles y no tienen dicha evaluación de variables;
  • Llamadas a métodos de objetos PHP usan el operador ->. Java usa el operador .;
  • Los constructores en Java llevan el nombre del nombre de la clase. En PHP se llaman __construct();
  • En objetos Java, this es implícito y solo solía ser explícito sobre el alcance y en ciertos casos con clases internas. En PHP5, $this es explícito;
  • Los métodos estáticos en Java se pueden invocar con el operador . en una instancia (aunque se desaconseja su validez sintáctica), pero en general se usa el nombre de clase en su lugar.

Estos dos son equivalentes:

float f = 9.35f; 
String s1 = String.valueOf(f); 
String s2 = "My name is Earl".valueOf(f); 

pero se prefiere el primero. PHP usa el operador de resolución de alcance :: para estática;

  • El método de anulación y sobrecarga es bastante natural en Java, pero un poco complicado en PHP;
  • El código PHP está incrustado en lo que de otra manera es en gran parte un documento HTML, muy parecido a cómo funcionan las JSP;
  • PHP utiliza el operador . para agregar cadenas. Java usa +;
  • Los métodos Java 5+ deben usar los puntos suspensivos (...) para declarar las listas de argumentos de longitud variable explícitamente. Todas las funciones de PHP son de longitud variable;
  • Las listas de argumentos de longitud variable se tratan como matrices dentro de cuerpos de métodos. En PHP debe usar func_get_args(), func_get_arg() y/o func_num_args();
  • y sin duda más, pero eso es todo lo que viene a la mente por el momento.
+0

No estoy de acuerdo o en desacuerdo, pero tengo curiosidad por lo que quiere decir con "Método de anulación y sobrecarga es bastante natural en Java, pero un poco de kludge en PHP ; ". A menos que me falta algo, ambos idiomas permiten al niño declarar nuevos métodos para anular los métodos que existen en la clase principal. –

+1

@ Alan, sí, pero en PHP si una clase tiene dos funciones del mismo nombre o no son 2 funciones de procedimiento del mismo nombre, obtiene un T_FUNCTION_EXISTS o algo así como el error –

1
  • podría utilizar JavaDoc herramienta para autogenerar la documentación de su software. Pero necesita escribir comentarios de manera específica.

  • no se puede ejecutar PHP en teléfonos móviles :) Hay una gran cantidad de entornos y plataformas de tiempo de ejecución. Eso significa que necesita pensar con anticipación qué bibliotecas podrían faltar o qué limitaciones podría haber (tamaño de pantalla, límites de memoria, delimitador de ruta de archivo "/" o "\", por ejemplo).

+0

Puede usar phpDocumentor phpdoc.org para lo mismo con PHP. Algunos teléfonos móviles tienen una versión de Java no estándar. – OIS

Cuestiones relacionadas