Tuve la oportunidad de tener una conversación interesante con mis compañeros de trabajo. La mayoría de ellos son scripts de acción flash o desarrolladores de Java.
Hablamos sobre qué tan bien php maneja la POO. Dije que PHP puede manejar casi todas las cosas de OOP a partir de PHP 5.2 o 5.3. ¿Me equivoco? No estoy tratando de obtener una respuesta sí / no, pero me gustaría escuchar más opiniones de los desarrolladores.
php
object-oriented
usuario23583
fuente
fuente
Respuestas:
PHP 5.3 en realidad tiene un soporte bastante decente para OOP.
El problema con PHP con respecto a la OOP es que la OOP realmente se atornilló al lenguaje, mientras que en lenguajes como Java y ActionScript es parte del concepto central, aunque considero que ambos son malos lenguajes OOP debido a su pobre semántica de objetos.
Aunque PHP hoy en día es en gran medida adecuado para OOP, el problema es que:
array
sigue siendo el tipo más importante y más utilizado y no es un objeto.PHP no puede simplemente deshacerse de todas las cosas heredadas. Si se lanzara un PHP 6, que arroja la mayor parte, probablemente no se usaría. Derrotaría su propósito.
Y PHP no pudo tomar un ritmo suficiente de despreciar gradualmente las cosas. Por lo tanto, tomará algún tiempo hasta que obtenga la claridad y consistencia necesarias que debe tener un buen lenguaje.
Personalmente, realmente no me gusta PHP, simplemente por todo ese equipaje, la API y todo.
Sin embargo, los marcos como Flow3, Symfony, CakePHP y Codeigniter proporcionan una base sólida para OOP y otros paradigmas poderosos. Debido a la restricción de ActionScript y Java, con suficiente esfuerzo (una capa de abstracción sobre los defectos de PHP), PHP puede estar a la par o incluso superarlos.
Para resumir: no hay nada particularmente malo con las instalaciones de OOP de PHP. Por lo tanto, se podría decir que no es un mal lenguaje OO . Sin embargo, hay muchas cosas particularmente malas con PHP, como que las instalaciones de OOP no se integran realmente , sino que simplemente se incluyen , por lo que podría argumentar que es un mal lenguaje de OO.
fuente
Encontrará que " puede manejar " no es lo mismo que " soportes ". Quiero decir, en el meollo de la cuestión, incluso C " puede manejar " OOP si estructura su código correctamente. La pregunta es si el lenguaje va más allá de simplemente permitir que OOP lo aliente al hacer que OOP sea la forma más natural de programar.
En mi experiencia (ciertamente limitada) los dialectos PHP 5.n no hacen esto. Es demasiado fácil salirse de la POO y entrar en un código casi puramente de procedimiento. (Tenga en cuenta que no creo que PHP sea un mal lenguaje por esta razón. Hay muchas razones por las que creo que PHP es un mal lenguaje, pero el soporte de OOP no es uno de ellos.;))
fuente
$e = function_that_returns_an_array()[0];
. Esto es lo que hay que hacer para solucionarlo:$a = function_that_returns_an_array(); $e = $a[0];
. Los idiomas cuya sintaxis no le permitirán usar directamente el resultado de una llamada de función me marcan. También, dime lo que el siguiente número es en decimal:0246875
. (Sugerencia: ¡no podrá encontrar una manera más tonta de implementar ese lexer!) PHP está lleno de este tipo de estupidez.En realidad, hay dos definiciones de la orientación a objetos de un lenguaje: cómo la orientación a objetos es su propia sintaxis incorporada y bibliotecas estándar, y qué influencia tiene en los programadores de software que escriben para ella.
Según la primera definición, PHP parece estar al final de la lista. Las personas a menudo citan cadenas y matrices que no son objetos como evidencia de esto. En mi opinión, esta definición realmente no importa. Siempre puede envolverlo en un objeto si realmente lo necesita , pero las personas no lo hacen porque no lo necesitan . Por lo general, la única diferencia que hará al código es cambiar
function(var)
avar.function()
. La sintaxis sola no cambia algo de no OOP a OOP.En cuanto a la segunda definición, las personas logran escribir código mal orientado a objetos, incluso en lenguajes que imponen con fuerza tales construcciones, y las personas que escriben un buen código orientado a objetos apenas se ven afectadas por el lenguaje, excepto por estar molestos por las peculiaridades sintácticas. En otras palabras, en mi experiencia, no hay lenguajes orientados a objetos malos, solo programadores orientados a objetos malos . PHP es tan bueno como cualquier otro lenguaje en ese sentido.
Quizás algunos lenguajes sean más adecuados para aprender programación orientada a objetos, pero creo que eso diferirá según el desarrollador. Para mí, no hizo clic hasta que leí el libro de camellos de Larry Wall sobre cómo Perl hace (¿hizo?) POO. Tener que bendecir explícitamente las referencias como pertenecientes a una clase realmente me llevó a entender qué es realmente una instancia de un objeto versus qué es una clase. Algunas personas prefieren el enfoque de Java de todos los objetos y todo el tiempo para el aprendizaje. Dado que la OOP es más una preocupación arquitectónica, es más fácil aprender después de conocer las variables básicas, las expresiones, la secuencia, la selección y la iteración, por lo que cualquier lenguaje que no le imponga la OOP de inmediato tiene una ventaja educativa en mi opinión.
Cuando mi esposa tomó una introducción a la clase de programación con Java, estaba constantemente frustrada por
public static void main
y poner todo en una clase, que aún no tenía el fondo para entender, pero su maestra le dijo que confiara en que lo necesitaba. Intenté explicarlo, pero es muy difícil explicarle a alguien que apenas aprendió sobre las variables por qué sería útil evitar que otras partes del código accedan a ellas y cómo decidir cómo dividirlo. Podría argumentar que aprender programación procedimental primero inculca malos hábitos, pero ¿qué pasa con el hábito de copiar y pegar código que no comprende?fuente
PHP no es malo para la programación orientada a objetos. Sin embargo, la naturaleza de PHP fomenta hacks rápidos y correcciones en comparación con el desarrollo adecuado de software orientado a objetos, y muchos libros y tutoriales ignoran por completo los conceptos de OOP. Puede soportar conceptos de POO bien, pero es responsabilidad del desarrollador saber aplicarlos. Puede hacer casi cualquier cosa en PHP que pueda hacer en un lenguaje OOP "verdadero" como Java o C #, pero esos lenguajes tienen una mayor aplicación de las técnicas OOP que PHP, que podría usar un estilo de procedimiento si lo desea.
No recuerdo la cita exacta, pero fue de alguien que comparó PHP en bruto con el uso del nuevo Ruby on Rails, y dijo algo así: Rails hace que escribir código bueno sea fácil y escribir código malo difícil. PHP facilita la escritura de códigos incorrectos y dificulta la escritura de códigos buenos. La línea sobre PHP lo resume bastante bien en OOP; es perfectamente capaz de ser un buen lenguaje OO, pero hace que sea un poco más difícil hacerlo.
fuente
PHP categorizado
PHP es solo un lenguaje de pegamento como BASH o Perl. Es bueno para eso, pero no es bueno para nada más, deje de lado un trabajo serio. El lenguaje no está diseñado. Simplemente evoluciona hackeando varios códigos juntos de una manera casual (código y arreglo).
Idiomas compilados
A diferencia de PHP, Java es un lenguaje compilado que ha sido diseñado adecuadamente. Hay JSR que definen el lenguaje, muchos marcos y conceptos de grado empresarial, como EJB, JMS, ESB, Spring, Struts, Hibernate y otros.
Software empresarial
En términos de sistemas empresariales, Java EE es una solución que se ajusta al propósito (Enterprise Edition), mientras que PHP se usa en empresas que intentan reducir costos mediante la contratación de una mano de obra barata con menos calificaciones.
Ha habido un esfuerzo considerable para arrastrar PHP al segmento Enterprise utilizando varios marcos. En particular, Zend Framework 2 . El problema fundamental aquí no es la orientación a objetos de PHP, sino la falta de diseño, falta de tipeo fuerte, soluciones no estándar a problemas estándar (tipo de pirateo para todo) y una falta completa de cualquier arquitectura prescrita.
Diseño de software (arquitectura discutida)
Con PHP, la carga del software de arquitectura aún depende completamente de los desarrolladores que han estado haciendo un trabajo muy pobre, es decir, a menudo no tienen ninguna arquitectura, solo codifican y arreglan al azar. Faltan la seguridad y las transacciones y los desarrolladores deben contar con calzado. En Java, una solución es EJB anotado. También considere el hecho de que, en PHP, no sucede nada si omite las excepciones de captura o comete varios errores. Eso es hasta el tiempo de ejecución. Con Java, recibirá advertencias y errores directamente en tiempo de diseño. Eso se llama robustez, pero con PHP solo puedes seguir soñando.
Multithreading
PHP no admite subprocesos múltiples. El código es siempre un solo hilo. Esto dificulta su rendimiento para problemas no triviales bajo una carga más pesada. Con Java EE, el subprocesamiento múltiple es totalmente compatible, por ejemplo, a través de la interfaz Runnable.
Soporte y estándares
Considere también la implementación, los servicios web y otros estándares. Mientras que en Java, hay grandes empresas como Oracle, IBM, RedHat, Apache y muchas otras, PHP solo tiene Zend.
Conclusión
Para concluir, PHP es un lenguaje orientado a objetos muy malo. Estrictamente hablando, ni siquiera está orientado a objetos, sino que es híbrido, lo que es malo para las versiones> 5 porque OOP está mezclado con la programación de procedimientos. Solo recomendaría PHP como pegamento como BASH, pero para un trabajo serio usaría Java EE.
Pensamientos relacionados
El acuerdo principal con el último Zend Framework 2 es que está tratando de ser como Java EE, pero no puede entregar al menos un conjunto remotamente comparable de paquetes disponibles, características, herramientas, automatización, verificación de errores, arquitectura, diseño y todo.
En mi experiencia, es más costoso usar PHP para proyectos complejos que con Java.
También hay algunos rumores como que PHP significa Programación bastante horrible . Puedo confirmar esto.
fuente
¿Qué tan bien maneja un lenguaje la POO? Prefiero preguntar qué tan bien puedo escribir un programa de una manera OO. Puedo ignorar la postura de todo-debería-ser-una-clase adoptada por Java al hacer que todo sea público estático .
PHP admite OOP; no me obliga a escribir de manera única. Lo bien que maneje depende de qué tan bien entiendo y escriba el programa de una manera orientada a objetos.
fuente
PHP admite rasgos! (a partir del 5.4) . Cualquier lenguaje que pueda manejar la reutilización horizontal de forma nativa es un lenguaje OO suficientemente bueno en mi libro.
fuente
Bueno, tenemos que pensar en lo que hace que un lenguaje sea más OO y qué razones hay para hacerlo así.
JavaScript es una implementación de ECMAScript que pretendía ejecutarse en el entorno del navegador como lenguaje interpretado . El hecho de que se cree que es un lenguaje interpretado tuvo un efecto muy grande en su diseño sintáctico / conductual.
Por ejemplo, no sigue a OOP. Pero aparte de eso hay muchos hechos como, OO programador puede encontrar algunos de sus comportamientos como el levantamiento de funciones muy confuso.
Una vez más, se incluyeron muchas cosas con los lenguajes OO como C ++, Java, C # para que sean compiladores eficientes como la escritura fuerte . Sin embargo, dado que JS se ejecuta en un entorno interpretado, no sigue una escritura fuerte, sino que es un lenguaje de escritura libre .
Además de las diferencias de comportamiento anteriores, hay muchas diferencias sintácticas como JS tiene notación de Object Literal que muy bien puede confundir a los programadores de C #. Sin embargo, C # también tiene una sintaxis literal de objeto, a pesar de que es un lenguaje compilado y dicha sintaxis rara vez se usa, ya que no es tradicionalmente el estilo de código OO.
Ahora hay un punto más que dicta si el lenguaje es bueno OO: es evolucionado de C ++. Como Java, C # evolucionó de C ++ y sigue un comportamiento y una sintaxis similares, una gran comunidad percibe tal comportamiento y sintaxis como la única cosa OO , y piensa que cualquier lenguaje que no inhiba tales similitudes simplemente no es OO.
Sin embargo, no olvidemos que OO es un concepto muy abstracto, no está vinculado a ningún estilo de sintaxis e incluso no a ninguna propiedad específica de comportamiento.
Y PHP está muy bien OO. Simplemente no se ve y se siente como Java, C ++, C # no lo hace pobre lenguaje OO. Bueno, aprendí C ++, luego Java y luego C #.
Entonces, hasta ahora mi cabeza estaba muy bien OO. Luego aprendí JS de un muy buen libro "Wrox Pro", y me dejó sin aliento. Acabo de disfrutar el comportamiento y la distinción sintáctica de JS. Entonces me doy cuenta de que la sintaxis literal de Object estaba en C #. Y ahora, mientras estoy aprendiendo PHP, siento que trae muchas cosas de ambos mundos.
Todo lo que realmente tenemos que hacer es aprender las sintaxis y las sutilezas de comportamiento que tiene un lenguaje al implementar OO. Una vez que los dominemos, podemos comenzar a pensar que esta es una mejor implementación de OO.
fuente