elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Funcionalidad de la POO en php
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funcionalidad de la POO en php  (Leído 3,833 veces)
. . .

Desconectado Desconectado

Mensajes: 68


Ver Perfil
Funcionalidad de la POO en php
« en: 21 Enero 2010, 19:39 pm »

Pues resulta que sigo con lo del POO. Espero que la gente experimentada en esto me pueda hechar una mano. La idea es hacer funcional la teoria sobre este paradigma:

Aqui vamos, tenemos una BD con una tabla llamada alumno, entonces siguiendo la teoria de POO debemos implementar un objeto para la representacion de esta tabla.

Tabla en Mysql

Código
  1. CREATE TABLE `alumno` (
  2.  `codigo` INT(11) NOT NULL AUTO_INCREMENT,
  3.  `nombres` VARCHAR(30) NOT NULL,
  4.  `apellidos` VARCHAR(30) NOT NULL,
  5.  `edad` INT(11) NOT NULL,
  6.  PRIMARY KEY  (`codigo`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Creamos una clase en php:

Código
  1. <?
  2. class Alumno
  3. {
  4. private _codigo
  5. private _nombre;
  6. private _apellido;
  7. private _edad;
  8. }
  9. ?>

Bien ese es el comienzo .. supongamos que los posibilidades de trabajo para esta tabla puedan ser: un select, un insert, un update o un delete, cual seria la mejor forma de implementar los metodos antes mencionados ¡?

Gracias


En línea

. . .

Desconectado Desconectado

Mensajes: 68


Ver Perfil
Re: Funcionalidad de la POO en php
« Respuesta #1 en: 22 Enero 2010, 00:26 am »

[Actualizado]
Si ven errores por favor comenten para corregirlos

Bueno pues aqui dejo un ejemplo 100% funcional de la funcionalidad del POO en php (valga la redundancia), creo que esto dara un ejemplo de lo potente que puede ser usar este paradigma.

Ire actualizando el hilo conforme mejore el codigo.

Saludos.

Conexion.php
Código
  1. <?
  2. class Conexion
  3. {
  4. private $_CON; //conexion
  5. private $_TABLA; //tabla a la que se le hara el select
  6. private $_CODIGO; //codigo del registro de la tabla
  7.  
  8. function Conexion()
  9. {
  10. $this->_CON = mysql_connect('localhost','root','root');
  11. mysql_select_db('web',$this->_CON);
  12. }
  13.  
  14. function datos($tabla,$codigo)
  15. {
  16. $this->_TABLA = $tabla;
  17. $this->_CODIGO = $codigo;
  18. }
  19.  
  20. function select()
  21. {
  22. $this->Conexion();
  23. $sql = "select * from $this->_TABLA where codigo='$this->_CODIGO'";
  24. $res = mysql_query($sql,$this->_CON);
  25. $datos = mysql_fetch_array($res);
  26. mysql_close($this->_CON);
  27. return $datos;
  28. }
  29. }
  30. ?>

Alumno.php
Código
  1. <?
  2. include_once("conexion.php");
  3.  
  4. class Alumno extends Conexion
  5. {
  6. private $_ALUMNO; //array del alumno
  7.  
  8. function Alumno($codigo)
  9. {
  10. $this->datos(__CLASS__,$codigo);
  11. $this->_ALUMNO = $this->select();
  12. }
  13.  
  14. function _get_codigo()
  15. {
  16. return $this->_ALUMNO['codigo'];
  17. }
  18.  
  19. function _get_nombres()
  20. {
  21. return $this->_ALUMNO['nombres'];
  22. }
  23.  
  24. function _get_apellidos()
  25. {
  26. return $this->_ALUMNO['apellidos'];
  27. }
  28.  
  29. function _get_edad()
  30. {
  31. return $this->_ALUMNO['edad'];
  32. }
  33. }
  34. ?>

index.php
Código
  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Documento sin título</title>
  5. </head>
  6. <body>
  7.  
  8. <?
  9. include("alumno.php");
  10. $alu = new Alumno(1);
  11. echo $alu->_get_codigo()."<BR>";
  12. echo $alu->_get_nombres()."<BR>";
  13. echo $alu->_get_apellidos()."<BR>";
  14. echo $alu->_get_edad();
  15. ?>
  16.  
  17. </body>
  18. </html>

Saludos y en cuanto esto mejore les comento.
Gratz ¡¡¡


« Última modificación: 22 Enero 2010, 02:11 am por Taoutew » En línea

Nakp
casi es
Ex-Staff
*
Desconectado Desconectado

Mensajes: 6.336

he vuelto :)


Ver Perfil WWW
Re: Funcionalidad de la POO en php
« Respuesta #2 en: 22 Enero 2010, 15:59 pm »

por que no usas mysqli? es mucho mas facil que crear otra clase con un driver mas lento (mysqli es mas rápido :P)

http://php.net/manual/en/class.mysqli.php

podrias basar tu clase inicial en esta :P (no heredar, adaptar ;) )
En línea

Ojo por ojo, y el mundo acabará ciego.
. . .

Desconectado Desconectado

Mensajes: 68


Ver Perfil
Re: Funcionalidad de la POO en php
« Respuesta #3 en: 22 Enero 2010, 16:34 pm »

por que no usas mysqli? es mucho mas facil que crear otra clase con un driver mas lento (mysqli es mas rápido :P)

¿ Un ejemplo funcional ?

(no heredar, adaptar ;) )

Adaptar en que sentido .. un ejemplo por favor.
En línea

MazarD
Colaborador
***
Desconectado Desconectado

Mensajes: 885


mazard.info


Ver Perfil WWW
Re: Funcionalidad de la POO en php
« Respuesta #4 en: 22 Enero 2010, 18:09 pm »

Yo creo que no hay nada que mejorar, supongo que mapearás __CLASS__ en un xml o parecido y eres de los que prefieren sanear las variables en la entrada de datos, yo prefiero hacerlo en cada clase pero es cuestión de gustos, tampoco hay más.
Solo apuntar que la poo no implica encapsular el acceso a datos en clases,aunque es aconsejable. Esto en realidad es el patron de diseño active record.

Saludos.

En línea

-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
irc://irc.freenode.org/elhacker.net
. . .

Desconectado Desconectado

Mensajes: 68


Ver Perfil
Re: Funcionalidad de la POO en php
« Respuesta #5 en: 22 Enero 2010, 20:24 pm »

...eres de los que prefieren sanear las variables en la entrada de datos...

...Esto en realidad es el patron de diseño active record....

Podrias explicar ambos puntos por favor ¿?



Ahora con respecto al codigo: En la clase conexion yo he considerado la funcion select porque no solo se tendra la clase alumno sino tambien docente, personal, etc (todas ellas heredaran de conexion el metodo select) ... creen ustedes que el enfoque es el correcto ?

Tambien podria ser valido no considerar select dentro conexion, habia pensando en que la clase conexion tenga un metodo que retorne la variable $this->_CON ... de esa forma podria llamarse a ese metodo (desde las clases heredadas) y todas las consultas irian en cada clase (alumno, docente, personal, etc). Es decir:

Conexion.php
Código
  1. <?
  2. class Conexion
  3. {
  4. private $_CON; //conexion
  5.  
  6. function Conexion()
  7. {
  8. $this->_CON = mysql_connect('localhost','root','root');
  9. mysql_select_db('web',$this->_CON);
  10. }
  11.  
  12. function conex()
  13. {
  14. $this->Conexion();
  15. return $this->_CON;
  16. }
  17. }
  18. ?>

Alumno.php
Código
  1. <?
  2. include_once("conexion.php");
  3.  
  4. class Alumno extends Conexion
  5. {
  6. private $_ALUMNO; //array del alumno
  7.  
  8. function Alumno($codigo)
  9. {
  10. $cone = $this->conex();
  11. $sql = "select * from __CLASS__ where codigo='$codigo'";
  12.                $consulta = mysql_query($sql,$cone);
  13. $this->_ALUMNO = mysql_query($consulta);
  14. }
  15.  
  16. function _get_codigo()
  17. {
  18. return $this->_ALUMNO['codigo'];
  19. }
  20.  
  21. function _get_nombres()
  22. {
  23. return $this->_ALUMNO['nombres'];
  24. }
  25.  
  26. function _get_apellidos()
  27. {
  28. return $this->_ALUMNO['apellidos'];
  29. }
  30.  
  31. function _get_edad()
  32. {
  33. return $this->_ALUMNO['edad'];
  34. }
  35. }
  36. ?>

Supongo que tambien es valido, el unico inconveniente es que se generaria mas codigo, puesto que en el constructor iria lo mismo (en todas las clases: alumno, trabajador, docente, etc ..)
En línea

MazarD
Colaborador
***
Desconectado Desconectado

Mensajes: 885


mazard.info


Ver Perfil WWW
Re: Funcionalidad de la POO en php
« Respuesta #6 en: 22 Enero 2010, 21:33 pm »

Citar
entonces siguiendo la teoria de POO debemos implementar un objeto para la representacion de esta tabla.
El hecho de que implementes una clase para representar una tabla no es un paradigma, es un patrón de diseño que se llama active record. Si hicieras las consultas cuando las necesitases en una clase cualquiera seguiria siendo poo.

Citar
...eres de los que prefieren sanear las variables en la entrada de datos...
Me refiero a que en:

Citar
$sql = "select * from $this->_TABLA where codigo='$this->_CODIGO'";

Tienes una inyección sql, si es el usuario quien define codigo en el constructor y no la saneas en ese momento tienes un problema, yo prefiero sanear cada variable en cada clase porque tiendo a reutilizar mucho código, pero hay quien lo hace en $_REQUEST['codigo'] una sola vez, en el caso de que no venga del usuario no hay que preocuparse.

Pero bueno, supongo que no tiene importancia porque ahora con el segundo código veo que esto deber ser más un trabajo de clase que algo real.
Sea como sea lo que está claro es que los dos casos son correctos, pero mi punto de vista sobre el código:


Citar
$sql = "select * from $this->_TABLA where codigo='$this->_CODIGO'";

Si creas una clase conexion, mejor que sea de verdad conexion y que la utilices siempre en esta clase o en cualquier otra(asbtracción) que sea plenamente objeto de base de datos simplemente heredando de la clase conexion.
El poner codigo= hace que esta clase solo te vaya a servir con tablas que tengan este campo.
Opciones:
-Lo mapeas en un xml igual que _TABLA
-No mapeas _TABLA, quitas el valor del constructor y creas selectById(tabla,campo,valor)

Imaginemos el segundo caso que es el más rapido de implementar, esto te permitiria tener una clase que te abstraeria de la base de datos, podrias crear metodos que te facilitarian mucho el trabajo a la larga: limpiartabla(tabla); deleteById(tabla,campo,valor); update(tabla,campo,valor,campocondicion,valorcondicion) etc etc

Entonces alumno evidentemente tiene que especificar más, en concreto la estructura de la tabla, con lo que tendrías selectbyId('Alumno','codigo',$codigo) donde codigo lo pasarias en el constructor. Además tambien seguirias especificando la estructura de la tabla con sus campos en cada getter y setter.
Que ventajas concretas te da esto gracias a la poo+active record:
-Si cambias de base de datos donde la sintaxi es distinta solo tendrás que crear otra clase conexion para la otra bd.
-Si cambias la estructura de la tabla usuario, ya sean los nombres de los campos, sus tipos o añades campos nuevos, solo tendrás que modificar la clase usuario.
Además del resto de ventajas de tener bien especificado cada concepto en una clase distinta.

El segundo código a mi me gusta menos, le quitas toda su potencia a conexion y el que después tengas que repetir código en el resto de clases no suele ser una buena señal.


Espero no haber sido muy coñazo, es que me gusta bastante la teoria de la poo :P.
Saludos!
« Última modificación: 22 Enero 2010, 21:41 pm por MazarD » En línea

-Learn as if you were to live forever, live as if you were to die tomorrow-

http://www.mazard.info
irc://irc.freenode.org/elhacker.net
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Funcionalidad = InSeguridad (Firefox & Gmail)
Seguridad
dimitrix 7 3,937 Último mensaje 20 Abril 2011, 21:14 pm
por dimitrix
Funcionalidad de....?¿?¿?¿?¿? URGENTE
GNU/Linux
jhonsc 0 1,446 Último mensaje 4 Diciembre 2011, 10:26 am
por jhonsc
No es un bug, es una funcionalidad
Foro Libre
Slava_TZD 3 1,969 Último mensaje 30 Noviembre 2017, 11:20 am
por Orubatosu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines