¿Quieres registrarte?

10 errores comunes programando orientado a objetos en PHP

Por: Maikel + 3 de Julio del 2007

El dominio de la programación orientada a objetos es, sin duda, uno de los paradigmas más codiciado por los programadores. Sin embargo, muchas veces estos cometen "atrocidades" al intentar implementarlo solo por decir a sus amigos, empresas u otros "Yo sé programar orientado a objetos".

A continuación verán una lista de 10 cosas que no se deben hacer al implementar programación orientada a objetos enfocándonos en el lenguaje PHP. Esta lista acompaña a nuestra vieja guía de 21 errores comunes programando en PHP.

  1. Usar variables globales dentro las clases: una de las ventajas más importantes de la programación orientada a objetos es la reusabilidad de los códigos. Al usar variables globales ($_GET, $_SESSION, $_POST, $_COOKIE, global) dentro de las clases, esta se ve comprometida considerablemente. La razón es que todos los proyectos no tienen las mismas variables globales.

  2. Mezclar código HTML en la definición de las clases: es una de las cosas que me sorprenden cada vez que la veo. Es inaceptable que esto se le haya ocurrido a algunos. Al mezclar HTML en el código PHP se compromete la reusabilidad de la clase, no todos los proyectos tienen el mismo código HTML.

  3. Imprimir salida (echo) dentro de las clases: aunque esto se parece a la anterior, me refiero a los echo o similares dentro de los métodos. Si una clase no está destinada para emitir salida no lo debe hacer. Para eso muchos utilizamos sistemas de plantillas.

  4. Identificadores de clases, métodos y propiedades sin sentido: un identificador siempre debe ser lo más descriptivo posible. A muchos le gusta usar identificadores increíblemente irrelacionados con su propósito. Esto compromete enormemente la lectura de un código. (Mira las reglas de codificación en PHP)

  5. Mezclar uso de versiones de php en una misma clase: a partir de la versión 5 de PHP, la programación orientada a objetos se puede implementar de una manera más formal, pues se introdujo los modificadores de visibilidad public, private, protected. Aparte de que se pueden crear clases de alto nivel (clase Abstractas) y métodos abstractos con la palabra reservada abstract. También se pueden definir los métodos y propiedades estáticas formalmente con la palabra reservada static. Mezclar la programación orientada a objetos en PHP 4 (donde todo era publico) con la de PHP 5 hace un código “sucio”. Consejo: elige una de las versiones y programa para ella.

  6. Más de una clase en un mismo archivo: definir distintas clases en un mismo archivo es otra de las cosas que no se debe hacer. Las clase se han de componer lo más reusables posible y si puedes nombrar al archivo con el nombre de la clase muchísimo mejor. Sigue el camino de los grandes lenguajes como: Actionscript, Asp.net, Java entre otros.

  7. No hacer pruebas unitarias a las clases: al terminar de codificar una clase recuerda de hacer pruebas unitarias para asegurar el correcto funcionamiento de clase. Esto es simplemente probar todos los posibles caminos que pueda tomar un estado (propiedad), parámetro de método, etc para que la clase no “explote”.

  8. Todos los métodos y las propiedades publicas en una clase de PHP 5: los programadores novatos cometen el error de definir todos los métodos y propiedades como públicos, por desconocer las ventajas de los modificadores visibilidad. En PHP este es un problema grave porque no hay tipeado de datos. El problema de las propiedades públicas es que no podemos controlar de manera fácil el tipo de datos que contiene por lo que nuestra clase pudiera explotar por un tipo de dato inesperado. Si no estas seguro de que visibilidad le debes poner a una propiedad hazla privada. Valida los tipos de datos de las propiedades al menos de una manera básica.

  9. Duplicación de métodos para ocultar falla de lógica: A diferencia de otros lenguajes como Java y C++, PHP no admite la sobrecarga de métodos. Al menos no de la manera tradicional. Esto, sin embargo, no es excusa para duplicar métodos sólo porque un dato cambia para la operación que éste realiza.

  10. Variables de configuración dentro de las clases: Los datos de configuración de base de datos, web services y otros deben ir en un archivo de configuración aparte, NO dentro de la clases que hacen uso de estas. Aunque se admite en clases que sea exclusivamente para ello.


Si te interesó el artículo, te interesará leer los 21 errores comunes programando en PHP y las reglas de codificación y lineamientos de código en PHP

 

También te interesa


Etiquetas php webmasters poo

Comentarios | Enviar un comentario
Buena información. Gracias Maikel (y)
Por: Zguillez
Excelente Maikel.

Muy buen artículo, a muchos nos hacía falta algo como esto.
Por: Reymond
muy bueno Maikel

(y)
Por: Jatrix13
Ostres Maikel, ostres, ostres, ...quiero un curso tuyo de programación orientada a objetos con php...!

queremos un curso tuyo!
queremos un curso tuyo!

Gracias!
Por:
de mas decirlo Maikel, simplemente excelente :)
Por: eldervaz
¡Muy buena nota!, el trabajo con Frameworks para PHP, nos acostumbra a trabajar con estas y muchas otras normas que se proponen a nivel de Seguridad, CVS y el aprovechamiento del ORM(Object-Mapping-Model), dejo aqui algunos de los mas famosos: [Symfony: http://www.symfony.es, CakePHP: http://www.cakephp.org/, Zend: http://framework.zend.com/ y el orgullosamente Colombiano Kumbia:http://201.245.53.58:81/Kumbia, Digo Orgullosamente por que yo soy Colombiano :D !.

PD: La mayoría ya tiene una documentación completa en español y posiblemente si no están familiarizados con los Frameworks se darán cuenta que nos hace ordenar mucho los proyectos Orientados a Objetos o a Servicios.
Por: vanvanero_blog
Excelentes artículos los dos, me han abierto los ojos a muchas cosas. Me he dado cuenta que no puedo conformarme con que mis códigos solo funcionen.
Por: Odin
Buen tip, me ayudara mucho a corregir algunos errores en mi sintaxis
Por: Victor-Nael
Excelente, muy buenos tips, explícitos y bastante útiles.
Por: bicho_O
Excelente muy bueno esos consejos nos ayudaran a ordenar y mejorar nuestros codigos, la reusabilidad en las clases es algo que descuidamos mucho. buenos consejos sin duda.
Por: babosonico_blog
no he entendido el punto 9
Por: manolo_blog

manolo_blog :

no he entendido el punto 9


El punto se refiere a hacer algo como esto:

Código :

public function foo($param1)
{
// Operación
}

public function foo2($param1, $param2)
{
// Ejecuta una operación muy parecida a foo pero con 2 argumentos
}


saludos
Por: Maikel

Maikel :

manolo_blog :

no he entendido el punto 9


El punto se refiere a hacer algo como esto:

Código :

public function foo($param1)
{
// Operación
}

public function foo2($param1, $param2)
{
// Ejecuta una operación muy parecida a foo pero con 2 argumentos
}


saludos

Para la sobrecarga de PHP hay que hacer eso Maikel

Código :

public function foo()
{
// Operación
}
public function foo1($param1)
{
// Operación
}
public function foo2($param1, $param2)
{
// Operación
}


y usar el __call para manejar eso, es la unica manera de hacer una "sobrecarga" como en otros lenguajes.

Fuente
Por: Dientuki

Código :

public function foo($param1, $param2="")
{
    // Operación
}
Como verás, no es necesario.
Por: Freddie
F, para el ejemplo que da Maikel, esa (la tuya) es una solucion correcta.

El punto 9 se basa en no repetir metodos por falla de logica, pero si quieres implementar sobrecarga de la manera tradicional, se debe repetir el nombre de la funcion seguido de la cantidad de parametros.
No quiero desviar el post... pero a PHP 5 le falta un poco de POO todavia :(
Por: Dientuki

Freddie escribió
public function foo($param1, $param2="")

{

// Operación

}


Es una solución que solía hacerse en php 4 y que igual sigue siendo efectiva, en PHP5 puede utilizarse también la función func_get_args(); y si como dice Dientuki PHP todavia le falta cosas para establecerse como un verdadero lenguaje de cuarta generación, pero eso es lo que nos estan prometiendo alcanzar en el no tan lejano lanzamiento de PHP6.

¡Aché pa'ti como aché pa'mi!
Por: vanvanero
[url] test[url]
Por: [url] test[url] _blog
Actualmente los frameworks son cada vez más necesarios en la programación de un sitio, sobre todo cuando se trata de aplicaciones complejas o empresariales. Los mismos incorporan buenas prácticas de programación como las mencionadas en el presente artículo. Ha sido un gran salto en la programación con la aparición de php5, con sus notables mejoras para la POO. Le comparto el siguiente artículo cabo de ver http://www.sitepoint.com/print/whats-new-php-5-3
Y para los que se inician usando un framework, les recomiendo Symfony, el cual está muy bien documentado, véase http://www.librosweb.es, será una guía para aprender otros, pues el mismo no reinventa la rueda, sino que aprovecha las mejores prácticas de otros y las acomoda a su estilo.
---------------------
http://www.htmleando.com
Por: Maikel González_blog
gracias por tus comentarios pipito
Por: keren alexandra-blog
te pongo mi hi5
Por: cintia-blog
Genial, no cometo ninguno de estos 10 errores
Por: BENKENOBI-blog
Hola. Muchas gracias por tu artículo, me ha sido de mucha ayuda. Ya estoy en el lío usando clases, plantillas y demás.

En cuanto a la clase Template, dos comentarios:

Primero, en inglés "read" es un verbo irregular, por lo que "readed" es incorrecto, debería ser "read" (aunque supongo que usaste readed para que quedara claro para qué sirve dicha variable).

Segundo. Parece ser que hay un bug, por el cual si usas una plantilla donde aparezca el caracter "'", pero no le pasas un Plantilla::setVars(), quedará formateada la salida en Plantilla:show() con la barra invertida de escape, eso es, \' (y no queremos substituir eso en nuestras plantillas solo porque no usemos setVars).

Como "workaround" al problema lo he solucionando poniendo el siguiente código al inicio de la función show():

if ( $this->vars == NULL )
$this->setVars(array());

Y eso llamará a setVars, aunque no lo usemos, antes de imprimir la salida, para forzar a que nuestros "\'" vuelvan a ser "'" simples.

Saludos!

Iván aka naibed.
Por: Gracias y dos comentarios
La versión de la clase que está publicada no la hice yo, solo hice el tutorial... Además el autor y yo comulgamos e hicimos varias mejoras ( una fue la corrección de ese bug que mencionas), pero debido a que no tenemos mucho tiempo libre no hemos publicado nuevas versiones.

saludos
Por: Maikel
Una duda el punto 7 es Hacer o NO hacer pruebas unitarias

Buenos tips.
Por: Tmeister
Son muy buenos tips a tomar en cuenta.!
Por: Mago.ozkuro

Maikel :

La versión de la clase que está publicada no la hice yo, solo hice el tutorial... Además el autor y yo comulgamos e hicimos varias mejoras ( una fue la corrección de ese bug que mencionas), pero debido a que no tenemos mucho tiempo libre no hemos publicado nuevas versiones.

saludos


kbr0n de cuando acá tan diplómatico? "el autor y yo". :lol:
Por: Dano

Tmeister :

Una duda el punto 7 es Hacer o NO hacer pruebas unitarias

Buenos tips.

El error es NO HACER pruebas unitarias.(recuerda que el tema es 10 errores al programar en OOP),

Tienes que hacer pruebas unitarias a las clases.

:wink:
Por: Dano
Muy bueno el artículo. PHP es un grande dentro de los grandes y su facilidad hace que cada vez mas personas trabajen con él.
Tratemos de hacer un código cada vez mejor, programemos orientado a objetos!
Saludos a todos


www.phppoo.freezoka.com/es/
Por: Paco-blog
Tengo una duda sobre el punto 6. ya que si, programo cada clases por separado, si una clase(C1) hace uso de otra(C2), la C1 debería tener un include a la clase(C2), el tema que la ruta de esa clase(C2) cambia dependiendo de donde se instancie la primer clase(C1).
¿Cómo puedo solucionar esto?
Por: Andrés-blog

Código :

<?php

include_once( dirname(__FILE__). "/Clase2.php"); // mismo directorio
include_once( dirname(__FILE__). "/../Clase2.php"); // directorio superior
include_once( dirname(__FILE__). "/lib/Clase2.php"); // directorio inferior

class Clase1 extends Clase2
{
}
?>


Con eso basta.

saludos
Por: Maikel
Muchas gracias Maikel
Anda perfecto.
Por: Andrés-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.