"Announce: Personal Home Page Tools (PHP Tools)" Ese es el encabezado con el que Rasmus Lerdof anunció el nacimiento de Personal Home Page Tools (PHP Tools) version 1.0. el 8 de junio de 1995.
|
etiquetas: php , cumpleaños , 25 años , lenguaje de programación
Eso que comentas de 40 conexiones y variables x, x2... eso pasa en mas gremios, no es unico.
Todos hemos visto codigo que no se puede tocar proque nadie sabe como funciona, se cierran los ojos y se sigue adelante. Culpa de la empresa por coger a cualquiera y ponerlo a picar.
Yo te contaria cosas que no creerias en el codigo, auntenticas basuras y chapuzas una encima de otra que no habia por donde cogerlo.
Solo que el PHP ya de por si es un saco de mierda, perdon pero es asi.
Ej:
String texto = "hola"; // Sin inferencia
var texto = "hola"; // Con inferencia
var a = 4
Con eso el lenguaje infiere que el tipo de a es un entero. Si intentases luego setearle un string te daría un error de compilación porque el tipo es entero. Lenguajes modernos que van tendiendo cada vez más a la programación funcional como Swift o Kotlin lo tienen, aunque ya tiene su tiempo, si no recuerdo mal Haskell ya tenía esto desde hace décadas.
En ese ejemplo parece una chorrada, pero es super útil cuando usas métodos con tipos genéricos y después de una cadena de funciones que aplican transformaciones (por ejemplo map) compruebas que el valor final tiene el tipo que esperabas (sobre todo si el IDE es bueno y te lo indica).
Total, que puedes tener la "sencillez" de PHP pero con la robustez de un lenguaje de tipado fuerte.
Pero antes de eso, mi primer editor WYSIWYG fue Netscape Composer, uno de los componentes de Netscape Communicator, que desde la versión 3, era una suite completísima. No fueron mis primeras páginas, no obstante. Puede que me equivoque, pero mi primera Web la realicé con el EDIT de MS-DOS, allá por septiembre de 1993.
Una vez puedo declarar el tipo de entrada y de salida de una función... declarar el tipo de una property de una clase me da bastante igual. Sobre todo si programo en condiciones y mis funciones suelen tener menos de 10 líneas y menos de 5 en su mayoría...
En resumen es mucho más útil poder hacer un
public function addBooks (Collection<Book> $books): Collection<Book>
que poder poner:
private array $books;
Esto último no aporta nada, lo primero me aporta robustez y me ahorra test unitarios al dejarlos implicitos en el propio código y pasar la responsabilida de su comprobacion al compilador (interprete en este caso) o analizador estático de código.
Y como me molaría que se soportase algo para hintear funciones anónimas y obligar a que te pasen una funcion que recibe XTipo y devuelve YTipo o similar...
Hubo una empresa que por no tener tipado estático y desarrollar un programa en JS puso la direccion de una cartera Ethereum sin comillas en la configuración, se interpretó como número octal y todo el dinero fue a parar a la nada
He tardado un poco en encontrar la noticia:
www.businessinsider.es/pierden-medio-millon-criptomonedas-culpan-infor
Pero claro, teniendo en cuenta que precisamente ahora en PHP están saliendo bastantes mejoras de tipado que afectan a la propia sintaxis... pues es una faena no tener esas actualizaciones si usas las últimas versiones de PHP.
Si con antiguo te refieres a la POO, no estoy de acuerdo, la POO sigue siendo el paradigma más extendido y le queda bastante recorrido ya que muchos de los problemas tienen un mapeo directo en Objetos. Otra cosa es que se estén añadiendo trazas de ProgramaciónFuncional porque para algunos casos concretos o algunas implementaciones facilite un código más limpio y conciso.
Si te refieres a lo verboso, estoy de acuerdo, lenguajes como scala o kotlin son mucho menos verbosos... pero volvemos a lo mismo. ¿Hay programadores? ¿Puedes pagarlos? ¿Me cuesta más ir migrando poco a poco según avanza PHP o reimplementar?
No me sorprende tanto el uso de PHP cuando hay cientos de programadores, haciendolos mucho más baratos por la oferta-demanda. Además de que el lenguaje es solo uno de los factores, PHP a nivel ecosistema es muy maduro y las facilidades de llevar algo del desarrollo a producción siguen siendo bastante top hoy en día.
Solucionao.
Deberías ponerte al día antes de criticar un lenguaje.
Mira, para empezar no debes asumir, ni mucho menos inventarte, el contexto de un trozo de código puesto ad hoc para ejemplificar algo concreto. Además, ese self pocho que has colocado no se va a comportar ni en tus sueños como lo que yo indicaba, para empezar porque self es la propia clase que contiene al método y si yo, por ejemplo, estoy en la hipotética clase Library y quiero ofrecer un hipotetico método getBooks y tipar que devuelve un objeto de tipo Collection con elementos del tipo Books, dista UNA BARBARIDAD de la guarrada que tú has colocado ahí y es, de hecho, imposible de tipar en PHP.
Te pongo un ejemplo más directo a ver si puedes comprenderlo. Vamos a tipar un metodo constructor que necesita como entrada una colección de libros y otro que la necesita de cassettes, cada uno estara en su clase respectiva, no nos interesa para el ejemplo, tampoco nos interesa su interior:
public function __construct(Collection<Book>){}
public function __construct(Collection<Cassette>){}
En PHP no puedes hacer eso y lo que te encuentras son docblocks del tipo:
/**
*@param Book[] $argument1
*/
o
/**
*@param Cassette[] $argument1
*/
Para que el IDE o el analizador de código estático tipo PHP Stan puedan interpretarlo y decirte que eres un paco y estás pasando el tipo de dato incorrecto.
¿La limitación? Pues que no es una carácteristica del lenguaje por lo que dependes de terceros y, además, que no puedes tipar el objeto genérico (Entry, HashMap, Collection, Array...) y si quieres un elemento de SPL o de cualquier librería como puede ser Doctrine y sus Collection pero con elementos de cierto tipo... pues, o te jodes y pones un if como una casa, o confías en que llegue sin que nadie la cague (a parte de poner un test).
Ale, solucionao, para la próxima aprende un poco de POO y asegurate de entender de lo que se está hablando antes de venir a hacer el cantamañanas y encima con chulería, que los junior engreídos soléis acabar bastante mal.
Por otra parte desde PHP 7 se soporta de forma nativa el tipado de argumentos y retornos. Sigue habiendo limitaciones
como genéricos, por ejemplo, que no existen o algunas APIs muy vetustas como las funciones de manejo de colecciones o de strings que son muy inconsistentes.
Si no entiendes que el objetivo de un ejemplo puesto en un minuto en un foro no es discutir si el ejemplo cumple un buen nivel de encapsulación, solid o el nombrado respetando el PSR... es que eres más limitado de lo que pensaba.
Los genéricos son muy útiles por ejemplo en cientos de casos, y PHP no los tiene. Al menos tragate la restregada de mano por tu cara con un poco de dignidad, pelagatos.
Venga, a tirar líneas de código, que en la última code review te han echado todo para atrás, paco.
¿Y vienes a por más?
Date una vuelta y descansa, campeón.
Puedes mentir todo lo que quieras, paco. De hecho mi intervencion fue para defender PHP y simplemente puntualicé que me parecía más útil haber implementado genéricos en 7.4 que la posibilidad de tipar las properties, cuando ya puedo tipar valores de entrada y salida de los métodos desde 7.0.
Eres tú el que se ha inventado una postura a la que atacar que nadie tiene y, como sabes que te has colado, te vas por las ramas y atacas a algo que está fuera del alcance del ejemplo propuesto.
Sigue, sigue bailando que me diviertes
Cuentame, ¿Qué más has aprendido ahora cuando has visitado la wikipedia para ver que era un genérico? Debes tener la cabeza calentita, que parece que estas cosas te cuestan.
Yo ahora mismo estoy haciendo cosas con Rust tiene un buen sistema de dependencia, y puedes hacer de todo, ahora lo más popular son librerías para audio, Webassembly el completo perfecto para js en lado del cliente, y hay ya frameworks web, hay gente pasando compiladores a Rust ya que es como una evolución lógica para C y casi tiene el mismo rendimiento.
Aquí tienes todas librerías que puedes instalar con cargo crates.io/
Puedes empezar aprender Rust aquí intro.rustbridge.com/
Yo lo estoy usando como web,un proyecto que tengo es usar una Raspberry pi con Rust y docker para controlar cosas domoticas de la casa uso rocket.rs/
Symfony 2 en adelante siempre ha estado hecho a bases de Bundles, no necesitas un Bundle lo eliminas y no pasa nada, ej, Twig, symfony form, etc. en cambio en Laravel es imposible desactivar blade aunque no lo uses, quitar eloquent es tarea muy difícil.
Más que una competición es flexibilidad, necesitas hacer un programa que solo guarde un tabla y un formulario lo harás antes en Laravel y ya todo integrado, pero estás atrapado en usar eloquent, en usar blade, etc, es rápido y muy funcional, pero tiene muchas funciones acopladas, yo soy de lso que usan Laravel y odio sus sistemas de Fake Facade y App Container no las uso, todo por DI en clases, al tener autowiring si no es algo especifico es muy rápido.
En Symfony tienes todo eso pero lo tienes que configurar más si empiezas sin nada, desde 4.4 volvieron al sistema de poder elegir que esqueletos quieres un con todo o uno pelado y luego tu montas los huesos.
Prueba los 2 y usa los 2 es mi consejo.
pd: link a lo que me refiero en symfony: symfony.com/download
apartado: "Creating Symfony applications"
Una de las lecturas mas entretenido de symfony era hacer tu propio framework así comprendes las entrañas de cosas como symfony o laravel symfony.com/doc/current/create_framework/index.html
Lo último que he probado ha sido eclipse con versiones de php 5.x (es lo que había en el servidor, solo he modificado algún script, no desarrollo proyectos completos ahí y no puedo cambiar todo a php7). Conseguí que funcionara añadiendo comentarios para definir el tipo en cada declaración de cada variable. Poco serio. Refactorizar debe ser como una peli de terror de serie B.
A mi me gusta PHP, me ha dado de comer durante muchos años y efectivamente el cambio desde php5 (y luego php5.4 y finalmente php7) marcó un punto de inflexión. Pero PHP está mal diseñado y tiene inconsistencias que otros lenguajes no tienen.
Es verdad que hay mucho proyecto mal hecho pero en 6 años solo he visto un código mal estructurad y espagueti, pero el trabajo de ahí era coger la lógica y pasarla a un framework moderno con PHP esto fue en el 2015, a partir de ahí yo no he vuelto usar PHP a pelo, todo con Symfony o Laravel, y 95% de todos los trabajos actuales de Barcelona en PHP es Laravel o Smmfony, alguno queda en Zend, Codeigniter.
Desde PHP 7 todo a cambiado, rendimiento, frameworks, etc.
En sitios donde pagan 40k o más no suelen utilizar arquitecturas MVC, sino otras más complejas. Lo que no puedes pretender es cobrar >40k y solo conocer la arquitectura más básica.
Estoy hablando de DDD, arquitectura hexagonal, sistemas distribuidos, colas de mensajería, Event-Sourcing, sistemas de caché y un largo etcétera.
Las empresas que utilizan estas herramientas y arquitecturas son aquellas que suelen pagar esos sueldos, porque son plataformas y empresas maduras tecnológicamente, independientemente del lenguaje. No creo que te vayan a pagar >40k por hacer páginas web en Drupal o WordPress.
Intenta escalar una plataforma que reciba cientos de miles de visitas con una simple arquitectura MVC. Buena suerte.
Prueba phpstorm y php7.x. Es que es otro mundo, nada que ver
Pero PHP también tiene lo suyo: notaciones camelCase/snake_case para el nombre de funciones, nombramiento confuso de estas funciones, ausencia de una guía de estilo oficial, notación muy sui géneris ("." para concatenar, includes y requires, ausencia de un builtin system para importar paquetes -namespaces en php-, símbolo $...), problema needle-haystack en los parámetros de funciones y tipado a gusto del consumidor. Y seguro que me estoy dejando cosas.
Aún así, me gusta PHP (pero python mucho más).
Insisto, um programador junior te va a jacet una mierda de programa en PHP o en C++. Claro que para hacer una web, que es el software que más se desarrolla ahora, no va a coger C++.
class BookCollection { private array $books; public function __construnct(Book ...$books) { $this->books = $books; } ... }
Solucionao.
Y de paso puedo meter ahí funcionalidad exclusiva para gestionar libros, que tú no puedes meter en tu colección genérica.
Ale, a pastar, nene, que tampoco es plan que te forme yo aquí, ni de explicarte por qué tus ejemplos exponen implementación interna, error típico de juniors que se pasan el encapsulamiento por el forro.
No se, es un saco de basura lo poco que lo vi, sinceramente.