¿Qué malos hábitos de programación / arquitectura puede desarrollar un codificador PHP autodidacta?

Estoy de acuerdo con Syd en que puedes escribir códigos incorrectos en cualquier idioma.

Dicho esto, hay algunas cosas muy específicas a las que los programadores que comienzan usando PHP como su primer lenguaje son vulnerables, y trataré de enumerarlos de la siguiente manera:

  • No entiendo cómo funciona la asignación de memoria, cómo la recolección de basura viene con inconvenientes de rendimiento y cómo puede ser extremadamente problemático su uso en ciertos dominios problemáticos.
  • Suponiendo que toda la memoria esté libre, ya que están aislados de la administración manual de memoria.
  • No comprende la representación interna de los tipos que se utilizan y las consecuencias de los mismos. (Por ejemplo, una declaración de cambio en las cadenas puede parecer lo mismo que un cambio en los enteros, aunque en el fondo el mapa corresponde a diferentes cosas internamente). Lo mismo ocurre con el uso de cadenas como enumeraciones.
  • No entiendo que hacer ciertas operaciones entre solicitudes en un servidor web es extremadamente costoso en comparación con un servidor que mantiene el estado del cliente en la memoria. Se puede hacer en PHP con APC, pero ingenuamente, algunos usuarios probablemente escribirán código que podría hacer una configuración de estado costosa para cada solicitud.
  • No comprende las ventajas de la serialización en formatos binarios frente a la serialización PHP, particularmente los beneficios de rendimiento.
  • PHP puede capacitar a las personas para alcanzar la supresión de @error en lugar de escribir realmente el código de manejo de errores.
  • Sin entender la diferencia entre las matrices y las matrices asociativas, qué operaciones son baratas para cada clase de estructuras y cuáles son baratas.
  • No comprende la implementación de las funciones array_ * y supone que son baratas.
  • No entender que defender campos nulos es algo malo.
    Es decir, en PHP puede verificar (isset (x-> y-> z)), y funcionará bien si y no está configurado y simplemente se comportará como si x-> y-> z fuera nulo. En C se bloqueará si y es nulo.
  • No entiendo la diferencia entre copias profundas y copias superficiales.
  • No entender la concurrencia, particularmente a nivel de hardware. Los usuarios del lenguaje nunca están expuestos a formas de simultaneidad más refinadas, tales como las E / S asíncronas controladas por eventos de estilo epoll.
  • Desarrollar una mentalidad de que la presentación y la lógica son para la salida es algo muy malo.
  • No entiendo por qué file_put_contents no es adecuado para instancias más exigentes de archivo / E / S.
  • Desarrollar la mentalidad de que está bien evaluar cosas como los nombres de funciones para ejecutar en tiempo de ejecución en función de una cadena mediante el uso de variables variables. He visto que el código que realmente almacenaba los nombres de las funciones de devolución de llamada para una determinada estructura de datos se escribe de forma persistente.

    El peor hábito de programación que puede desarrollar con PHP: “Si no funcionó correctamente, simplemente cambiaré algo y presionaré volver a cargar”, es decir, piratería, no ingeniería.

Muchos de mis estudiantes de primer año ya conocen algo de php, algunos lo escuchan en la escuela, muchos son autodidactas. Hay muchas cosas que puedes aprender solo de Internet. Pero hay muchas trampas.

Aquí hay algunos ejemplos de código problemático que he visto de primera mano. Trataré de explicar cuál es el problema subyacente en todos los casos:

No queriendo entender el código

Muchas personas solo quieren aprender suficiente PHP para resolver un problema en particular
problema. Entonces, su primera entrada en la programación es copiar y pegar
método: encuentre un programa que se ajuste a sus necesidades, cópielo, haga un mínimo
cambios

Algunas personas se sienten atraídas por la programación por esto, quieren
entienden la lógica del código, quieren aprender a escribir mejor
código. Otras personas no lo hacen. Usan código que no (quieren) entender,
y terminar con Cargo Cult Programming
http://en.wikipedia.org/wiki/Car

Eso no es algo que veo con los estudiantes de primer año de CS, es más típico
para principiantes diseñadores web.

Escribiendo C en PHP

Kartik Ayyar escribió mucho sobre cosas que los programadores de C saben. En mi opinión, la mayoría son cosas que los programadores de PHP no necesitan saber. El objetivo de utilizar un lenguaje de nivel superior es apegarse al nivel superior que es más expresivo [2] y, por lo tanto, ser más productivo que un programador en C. Vea el artículo seminal de John Ousterhouts “Scripting: programación de nivel superior para el siglo XXI” [1] y Lutz Pretchelds “Una comparación empírica de C, C ++, Java, Perl, Python, Rexx y Tcl para un programa de búsqueda / procesamiento de cadenas” [3]

  1. http://www.tcl.tk/doc/scripting… .
  2. http://en.wikipedia.org/wiki/Com
  3. http://page.mi.fu-berlin.de/prec

Si solo usa esas partes de PHP que son equivalentes a las construcciones en C, escribirá un código PHP incorrecto.

Un ejemplo simple sería el manejo de cadenas: en PHP hay una interpolación variable . No utilice la cadena de contacto si no tiene que:

  echo "

Número de teléfono para". $ n. "

"; echo "

". $ no. "

";

Esto solo agrega ruido al código y lo hace menos legible. Utilice la interpolación variable cuando sea posible:

  echo "

Número de teléfono por $ n

"; echo "

$ no

";

Otro problema es el uso adecuado de matrices asociativas . Las matrices asociativas son uno de los tipos de datos integrados de un lenguaje de script, tiene sentido usarlos. Así que no use dos matrices para la búsqueda:

  función de búsqueda ($ consulta) {
     $ nombre [0] = "kili";  $ phone [0] = "+99 2398 983298";
     $ nombre [1] = "fili";  $ phone [1] = "+99 9983 983298";
     $ nombre [2] = "bifur";  $ phone [2] = "+99 298 398 3298";
     $ nombre [3] = "bofur";  $ phone [3] = "+99 2 398 9 83298";
     $ nombre [4] = "bombur";  $ phone [4] = "+99 2398 983298";

     $ resultado = falso;

     for ($ i = 0; $ i 

Use una matriz asociativa

  función de búsqueda ($ consulta) {
     $ nombre ["kili"] = "+99 2398 983298";
     $ nombre ["fili"] = "+99 9983 983298";
     $ nombre ["bifur"] = "+99 298 398 3298";
     $ nombre ["bofur"] = "+99 2 398 9 83298";
     $ nombre ["bombur"] = "+99 2398 983298";

     return $ name [strtolower ($ consulta)];
   } 

Tutoriales / documentación obsoletos
PHP ha existido por más de 15 años. el lenguaje ha evolucionado, se resolvieron problemas, se hicieron mejoras. pero los tutoriales y el código de ejemplo en Internet no muestran signos de envejecimiento. Como principiante, no se puede distinguir el estado actual de la tecnología de muy desactualizado.

Por ejemplo: inyección SQL . El problema es tan antiguo como PHP, las soluciones ofrecidas por PHP han cambiado y mejorado con los años.

En tutoriales, libros y cursos muy obsoletos, el problema simplemente se ignora:

  $ id = $ _GET ['id'];
 mysql_query ("BORRAR DEL artículo DONDE id = '$ id'");  // no lo hagas !!!!  usa este código

Básicamente, PHP ofrece dos formas de tratar con la inyección SQL: analizar + escapar de la entrada o consultas parametrizadas. Los expertos en Stackoverflow están de acuerdo en que las consultas parametrizadas son la solución preferida http://stackoverflow.com/questio ...

¡Pero la documentación oficial de PHP ni siquiera los menciona!
http://at2.php.net/manual/en/fun ...
http://php.net/manual/en/securit ...

Fracaso en comprender conceptos avanzados
Es trivial buscar comandos individuales en la documentación, es más difícil encontrar buenos tutoriales que enseñen habilidades básicas de programación. Es realmente difícil aprender conceptos más avanzados en línea: estas cosas están ocultas en los libros (ya sabes, las grandes cosas de papel).

Un resultado de solo aprender la sintaxis y no la forma de usar un concepto sería el uso gratuito de las clases :

por ejemplo, a menudo veo código en el que las personas envuelven PDO (una interfaz de base de datos orientada a objetos en PHP) en su propia clase sin agregar ninguna funcionalidad, a menudo eliminando parte de la funcionalidad. Su comprensión de la programación orientada a objetos parece ser: agregar una clase hace que todo sea mejor.

Otro ejemplo sería crear una clase para cada página web que desee servir.

Defectuoso entendimiento de la optimización
Los programadores autodidactas a menudo caerán en la trampa
de "optimizar" partes de su programa que no necesitan optimización - un desperdicio
de su tiempo y a menudo en detrimento de la legibilidad.

ejemplos:

usando la concatenación de cadenas en lugar de la interpolación variable "porque es más rápido", una práctica que hace que el código sea menos legible y le dará microsegundos de tiempo de ejecución del programa.

construyendo un sitio web de 5 páginas cargando el contenido con ajax en index.php, dejando la URL de todas las páginas igual, manteniendo los motores de búsqueda leyendo su página, haciendo imposible que otros sitios se vinculen a las páginas individuales de su sitio.

Las personas no parecen entender que las herramientas que tienen (PHP, MySQL, Apache) son perfectamente adecuadas para servir páginas web a cientos de personas; no es necesario optimizar nada.

La cita de Donald Knuth es muy aplicable al desarrollo web del lado del servidor:

"Deberíamos olvidarnos de las pequeñas eficiencias, digamos alrededor del 97% del tiempo: la optimización prematura es la raíz de todo mal"
Knuth, Donald. Programación estructurada con ir a declaraciones , ACM Journal Computing Surveys , Vol. 6, Núm. 4, diciembre de 1974. p.268.

Si hay un lugar para la optimización en el desarrollo web, probablemente esté del lado del cliente, no del lado del servidor. Vea el trabajo de Steve Sounders y sus equipos, incluidas las herramientas yslow y los libros Sitios web de alto rendimiento e incluso sitios web más rápidos.

Las buenas noticias
Muchos programadores autodidactas logran evitar estos problemas, encontrar los libros, tutoriales, páginas web y blogs adecuados para aprender y convertirse en grandes programadores.
Muchos más ingresan a la universidad, donde encuentran una comunidad de expertos y compañeros para aprender.