Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

[SOLUCIONADO] amateur POO

Estas en el tema de amateur POO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hol amigos como el tema indica soy novato en POO , despues de mucho pensarlo voy a pasar a trabajar con objetos me costaba un ...
  #1 (permalink)  
Antiguo 27/07/2012, 19:14
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
amateur POO

Hol amigos como el tema indica soy novato en POO , despues de mucho pensarlo voy a pasar a trabajar con objetos me costaba un poco pero ya me he dado cuenta del potencial , ahora ando un poco perdido pero bueno nadie nadie nace sabiendo , he hempezado por hacer mi conexion he entrado en php.net para ver como debea de ser ya que tambien me voy a poner con las consultas preparadas MSQLI asique al lio:

este script lo he bajado del manual de php que indica como debe de ser la conexion

http://www.php.net/manual/es/mysqli....onnections.php

$mysqli = new mysqli("localhost", "usuario", "contraseña", "basedatos");
if ($mysqli->connect_errno) {
echo "Fallo al contenctar a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
echo $mysqli->host_info . "\n";


yo lo he intentado adaptarlo a una clase



<?php

class Conexion{

private $servidor = 'localhost';
private $usuario = 'root';
private $contrasena = '';
private $database = 'test';

public function __constructor($servidor, $usuario, $contrasena, $database)
{
$this->servidor = $servidor;
$this->usuario = $usuario;
$this->contrasena = $contrasena;
$this->database = $database;
}

public function conectar()
{
$mysqli = new mysqli($this->servidor, $this->usuario, $this->contrasena, $this->database);

if ($mysqli->connect_errno)
{
echo "Fallo al conectar a MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
else
{
echo $mysqli->host_info . "\n";
}
}
}


$db= new Conexion();
$db->conectar();

?>

y mi pregunta es si esta bien planteado o creen que deberia de cambiar algo ay algo mal no se cualquier cosa ,se que falta cerrar la conexion ojo, vamos que lo que quiero es que me evaluen pero poder ir avanzando , como si fuerais mis profes jajaa

muchas gracias
  #2 (permalink)  
Antiguo 27/07/2012, 22:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Pues lo primero sería guardar la instancia de $mysqli en una propiedad de tu clase, si no solo va a estar disponible en el ámbito de conectar().

En lo personal yo te recomendaría usar PDO directamente por la portabilidad entre bases de datos.

Saludos.
  #3 (permalink)  
Antiguo 28/07/2012, 06:10
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

Es el primer script que hago en POO , y tienes razon mysqli deberia instanciarlo en el contructor verdad??

Asique me recomiendas mas PDO que mysqli ??? si solo fuera a usar mysql con mysqli valdria , pero si en un futuro puede ser que cambies de bd es mas recomendable pdo a eso te refieres verdad

y otra cosa que hare es pasar las variables desde un archivo de configuracion (server,user,password,bd) es mas recomendable verdad??
  #4 (permalink)  
Antiguo 29/07/2012, 17:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Así es, siempre es mejor usar un archivo de configuración.
  #5 (permalink)  
Antiguo 29/07/2012, 18:06
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

Oye gatorv una preguntita , para traer esos datos a la clase desde el archivo de configuracion , he estado investigando y incluso he hecho un tema para resolverlo por que no daba con ello http://www.forosdelweb.com/f68/varia...clase-1005959/ despues de un rato he dado con ello y la solucion creo que son las constantes,,¿? eso es asi verdad¿? o me estoy equivocando
  #6 (permalink)  
Antiguo 29/07/2012, 18:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Pues no creo que sea lo más adecuado, ya que una constante es eso, aparte de que queda plasmado en el cídigo, yo usaría mejor un archivo de configuración para que los valores sean más fáciles de modificar.
  #7 (permalink)  
Antiguo 29/07/2012, 18:15
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

pero no he encontrado otra manera de pasar los valores a las ""propiedades"" desde un archivo externo

y en el archivo de configuracion como guardas los valores en una variable normal

$server = 'locahost';


es que segun he leido en php

// Declaraciones inválida de propiedades:
public $var4 = self::myStaticMethod();
public $var5 = $myVar;

// Declaraciones válida de propiedades:
public $var6 = myConstant; // creia que esta es la unica manera de meter datos a las propiedades externamente , si no como los meto¿?
public $var7 = array(true, false);

como las deberia de psar del config a la clase¿?me estoy volviendo loco con esto la verdad, pero a las propiedades no a un metodo eso si se hacerlo , pero necesito crearlo en las propiedades
  #8 (permalink)  
Antiguo 29/07/2012, 18:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Pues lo que pasa es que no las debes de definir en la clase, la idea es que tu clase sea lo más transparente, recuerda el polimorfismo de la clase.

Si lo que quieres es levantar con propiedades ya definidas tu clase, eso lo debe de hacer un helper, como el patrón factory, donde por medio de una cadena le indiques que DataSource usar, por ejemplo:
Código PHP:
Ver original
  1. $db = DBFactory::factory('default');

La clase DBFactory va a usar el patrón factory para cargar el archivo de configuración, e instanciar tu objeto DB y devolverte un objeto ya listo para que lo consumas.

Saludos.
  #9 (permalink)  
Antiguo 29/07/2012, 18:30
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

ok creo que me sirvio voy a intentar implementar lo que yo quiero cn vuestras sugerencias y cuando termine lo subo para echarle un vistazo , thanks !!
  #10 (permalink)  
Antiguo 29/07/2012, 19:02
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

He leido un tema en el que casualmente apareces gatorv jeje y me has dado la solucion a mis problemas

""Porque no haces un "registro" o un "almacén" de variables publicas?""

en esta pagina

http://www.forosdelweb.com/f68/clase...cucion-548021/

podria crear asi el archivo de configuracion y despues extenderlo a las clases donde se necesiten los datos como por ejemplo la clase de conexion y pasarle los datos servidor , user etc.... esto es mucho mejor que pasarlo a traves de constantes......


o la ultima solucion que veo es pasar un include en el constructor

Última edición por webankenovi; 29/07/2012 a las 19:44
  #11 (permalink)  
Antiguo 29/07/2012, 20:42
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

No era exactamente lo que te decía, pero lo puedes usar, el chiste es que cada clase tenga su diseño, y su alcance bien definido, recuerda que no debes de heredar por heredar, es el concepto de polimorfismo, que cada clase tenga su comportamiento exacto.
  #12 (permalink)  
Antiguo 29/07/2012, 21:30
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

si si cada clase su archivo su alcance y su diseño bien definido es la idea , por eso no me lo tomo a la ligera y no tomo cualquier medida y busco la accion correcta y gracias a gente como tu que se molestan en ayudar a gente como yo lo conseguire jeje .

mira voy a ser lo mas especfico que pueda ser.

1- Archivo config

iniciamos variables de configuracion

por ejemplo las de conexion mysql

$server ='localhost';
$user ='root';
$pass ='';
$database ='test';

///// seguimos cargando variables etc......


2- Archivo mysqli

contiene la clase de la bd (conexion,selectdb,cambiar usuario,ping() y algun metodo mas)
no las consultas


3 Archivo autoload

carga la clase



ahora bien como introduzco las variables del archivo config , dentro de una clase ( en este caso archivo clase mysqli ) como atributos para poder usarlo en todos los metodos

Última edición por webankenovi; 29/07/2012 a las 21:53
  #13 (permalink)  
Antiguo 29/07/2012, 23:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Puedes usar un archivo ini, o un array de PHP y pasarlo con un include.
  #14 (permalink)  
Antiguo 30/07/2012, 09:36
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

gracias creo que esa es la solucion .
  #15 (permalink)  
Antiguo 30/07/2012, 14:35
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

mira gatorv al final lo he dejado asi y funciona sin problemas aun me falta añadirle cosillas y mas metodos poco mas pero esta es la base , como ves creo un constructor y traigo del config los datos y ya tengo los atributos dentro para todos los metodos que incluya ademas de la conexion , en el metodo connect hago la conexion y ademas creo el atributo mysqli para tenerlo funcional en los demas metodos , dime si esta bien planteado o cometi algun error , por otro lado implemento una interface ya que esto es pensando el el futuro si deseo añadir algun driver mas de base de datos entonces tengo una interface que todos los drivers deben de cumplir , por ejemplo connect() y close()

Código PHP:
Ver original
  1. <?php
  2.  
  3. class mysqlidriver implements database
  4. {
  5.   public function __construct()
  6.     {
  7.         require_once '/application/core/config.ini';
  8.  
  9.         $this->server   = $server;
  10.         $this->username = $username;
  11.         $this->password = $password;
  12.         $this->database = $database;
  13.     }
  14.  
  15.     public function connect()
  16.     {
  17.         $mysqli = new mysqli($this->server,$this->username,$this->password,$this->database);
  18.  
  19.         $this->mysqli = $mysqli;
  20.     }
  21.  
  22.     public function close()
  23.     {
  24.         $this->mysqli->close();
  25.     }
  26. }
  27.  
  28.  
  29. ?>

o esta otra forma que acabo de crear no se cual es mas correcta

Código PHP:
Ver original
  1. <?php
  2.  
  3. require_once '/config.ini';
  4.  
  5. class mysqlidriver{
  6.  
  7. public $server   = 'localhost';
  8. public $username = 'root';
  9. public $password = '';
  10. public $database = 'test';
  11.  
  12.     public function __construct($username=NULL,$password=NULL,$database=NULL,$server=NULL)
  13.     {
  14.         $this->server   = is_null($server)   ? $this->server   : $server ;
  15.         $this->username = is_null($username) ? $this->username : $username ;
  16.         $this->password = is_null($password) ? $this->password : $password ;
  17.         $this->database = is_null($database) ? $this->database : $database ;
  18.     }
  19.      
  20.     public function connect()
  21.     {
  22.         $mysqli = new mysqli($this->server,$this->username,$this->password,$this->database);
  23.      
  24.         $this->mysqli = $mysqli;
  25.     }
  26.      
  27.     public function close()
  28.     {
  29.         $this->mysqli->close();
  30.     }
  31. }
  32.      
  33.      $db = new mysqlidriver($username,$database,$password,$server);
  34.      
  35. ?>

Última edición por webankenovi; 30/07/2012 a las 15:04
  #16 (permalink)  
Antiguo 30/07/2012, 15:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

¿que pasa en caso de que te quieras conectar a 2 bases de datos?
  #17 (permalink)  
Antiguo 30/07/2012, 15:24
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

todavia no he planteado ese problema

pero creo que habria un problema de identificador , ademas debo de usar 2 bases de datos jeje

bueno podria crear otro metodo con una conexion que cree otro identificador y pase nuevos parametros ¿?

He pensado esta idea y no se si es valida



Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. require_once '/config.ini';
  5.  
  6.  
  7.      
  8. class mysqlidriver{
  9.  
  10.     // configuracion por defecto si no llegan parametros
  11.  
  12. public $server   = 'localhost';
  13. public $username = 'root';
  14. public $password = '';
  15. public $database = 'test';
  16.  
  17.     public function __construct($username=NULL,$password=NULL,$database=NULL,$server=NULL)
  18.     {
  19.         $this->server   = is_null($server)   ? $this->server   : $server ;
  20.         $this->username = is_null($username) ? $this->username : $username ;
  21.         $this->password = is_null($password) ? $this->password : $password ;
  22.         $this->database = is_null($database) ? $this->database : $database ;
  23.     }
  24.      
  25.     public function connect()
  26.     {
  27.         return  new mysqli($this->server,$this->username,$this->password,$this->database);
  28.     }
  29.      
  30.     public function connecttwo($server,$username,$password,$database)
  31.     {
  32.         return  new mysqli($server,$username,$password,$database);
  33.     }
  34.      
  35.     public function close($val)
  36.     {
  37.         $val->close();
  38.     }
  39. }
  40.      
  41.      $db = new mysqlidriver();
  42.      $db->connect(); // conecto por defecto si no instancio los parametros
  43.      $db->connecttwo('localhost','root','','otra bd');
  44.  
  45.  
  46. ?>

Última edición por webankenovi; 30/07/2012 a las 15:46
  #18 (permalink)  
Antiguo 30/07/2012, 15:56
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Como te digo, cada clase debe de tener su propia responsabilidad, si te fijas son dos cosas diferentes, una es tu clase DB que se encarga de hacer consultas contra una Base de Datos, otra cosa es, el iniciar y levantar tu clase con los datos que necesites, por eso es que te decía que usaras un DB Factory, o algún método similar que sea el encargado de dejar tu objeto DB listo para usarse.

Saludos.
  #19 (permalink)  
Antiguo 30/07/2012, 16:05
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

vale vale lo acabo de pillar

acabo de leer este articulo

http://www.aramirez.es/blog/patron-f...e-forma-facil/

claro asi es mucho mejor para pasar varias conexiones etc...

Última edición por webankenovi; 30/07/2012 a las 17:52
  #20 (permalink)  
Antiguo 31/07/2012, 12:56
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

buenas de nuevo mira he intentao adaptarlo a el patron factory no se si lo hice bien pero bueno , yo le mando a que conexion conectarse , el valor lo extraigo del config.

mas o menos lo que hice lo hice de ejemplo para probar y eso seguro que faltaran cosas , lo que me interesa es si he entendido el concepto

archivo unico factory conexion
Código PHP:
Ver original
  1. <?php
  2.  
  3. class conexion
  4. {
  5.     public function __construct($tipo)
  6.     {
  7.         $this->db = c_conexion::create_connection($tipo);
  8.     }
  9.        
  10. }
  11.  
  12. ?>


controlador de la conexion , de aqui iriamos al archivo que controla la aplicacion de la conexion elegida y que esa ya si lleva los metodos
Código PHP:
Ver original
  1. <?php
  2.  
  3. class c_conexion extends conexion
  4. {
  5.     public static function create_connection($type)
  6.     {
  7.         switch ($type)
  8.         {
  9.             case 'mysql':
  10.             $db = new mysql();
  11.             break;
  12.  
  13.             case 'oracle':
  14.             $db = new oracle();
  15.             break;
  16.  
  17.             default:
  18.             $db = new mysqli;
  19.         }
  20.  
  21.         return $db;
  22.     }
  23.  
  24.  
  25. }
  26.  
  27. ?>

no se como lo ves , pero asi si se puede inicar mas de una conexion si no me equivoco

Última edición por webankenovi; 31/07/2012 a las 13:03
  #21 (permalink)  
Antiguo 31/07/2012, 14:38
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Todavía tienes un poco errado lo que es el patrón Factory, la idea de este es que cree otros objetos y los deje listos para usarse.

Lee este tema es básicamente lo que quieres hacer:
http://www.forosdelweb.com/f18/duda-...-clase-835534/

Saludos.
  #22 (permalink)  
Antiguo 31/07/2012, 15:09
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

bueno me estoy volviendo un poco loco con esto la verdad pero espero poder llegar a enterderlo, para mi es algo muy nuevo la programacion orientada a objetos.

Creo haber entendido por fin el patron, te pongo este ejemplo que si es correcto doy por finalizado este tema

Código PHP:
Ver original
  1. <?php
  2.  
  3. class MySQL
  4. {
  5.     public function __construct()
  6.     {
  7.         echo "Constructor MySQL";
  8.     }
  9.  
  10.     public function connect()
  11.     {
  12.         echo "Conectar con MySQL";
  13.     }
  14. }
  15.  
  16. class MySQLi
  17. {
  18.     public function __construct()
  19.     {
  20.         echo "Constructor MySQLi";
  21.     }
  22.  
  23.     public function connect()
  24.     {
  25.         echo "Conectar con MySQLi";
  26.     }
  27. }
  28.  
  29. class database
  30. {
  31.     public static function factory($type)
  32.     {
  33.         if(class_exists($type))
  34.         {
  35.             return new $type();
  36.  
  37.         }else
  38.  
  39.             echo "Error. la clase '".$type."' no existe";
  40.  
  41.         return 0;
  42.     }
  43. }
  44.  
  45.  
  46. $obj1=database::factory("MySQLi");
  47. $obj1->connect();
  48.  
  49.  
  50. ?>
  #23 (permalink)  
Antiguo 31/07/2012, 16:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Pues sí eso parece más una fábrica de conexiones, yo cambiaría el nombre de las clases para reflejar que es lo que hacen pero básicamente sí es eso.

El patrón factory es muy útil y pues su nombre dice, lo que es, una fabrica de conexiones, debe de crear conexiones, es casi como heredar pero es una relación de uso más que nada, es por eso que no hay herencia.

Muchos tratan de aplicar factory para que sea una fábrica genérica y construir objetos de todo tipo, pero ese también es un horror, ya que cada fábrica debe de tener su alcance.

Te invito a que leas el tema que te puse, ya que habla de todos estos conceptos y tiene muchos códigos de ejemplo.

Saludos.
  #24 (permalink)  
Antiguo 31/07/2012, 16:12
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

!! ..... muchas gracias por todo ..... !!
  #25 (permalink)  
Antiguo 31/07/2012, 16:35
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

una ultima pregunta esto que te voy a mostrar queria saber si es equivalente a el ejemplo anterior y si es mejor o peor y los por que si me lo puedes decir claro

Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. function _mysql(){
  5.  
  6.  
  7. echo 'conectado mysql';
  8.  
  9. }
  10.  
  11. function _oracle(){
  12.  
  13.  
  14. echo 'conectado oracle';
  15.  
  16. }
  17.  
  18. function database($type){
  19.  
  20.         if(function_exists($type))
  21.         {
  22.             return $type();
  23.         }
  24.         else
  25.         {
  26.             echo "Error. la funcion '".$type."' no existe";
  27.  
  28.             return 0;
  29.         }
  30.  
  31.  
  32. }
  33.  
  34. database('_mysql');
  35.  
  36. ?>

Muchas gracias.
  #26 (permalink)  
Antiguo 31/07/2012, 20:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Pues, por lo que veo es programación estructural, la cual es diferente a la POO, en todo.
  #27 (permalink)  
Antiguo 01/08/2012, 09:13
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

si si , ya se que son diferentes , pero habla sobre tiempo de ejecucion , ventajas desventajas esas cosas , muchas gracias .
  #28 (permalink)  
Antiguo 01/08/2012, 09:34
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: amateur POO

Pues ese código que pones es muy simple como para hablar sobre tiempo de ejecución va a ser el mismo ya que no hacen mucho.

¿Ventajas y desventajas? Pues repito lo mismo es un código muy sencillo como para hablar de ventajas y desventajas ya que es prácticamente lo mismo.
  #29 (permalink)  
Antiguo 01/08/2012, 09:39
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: amateur POO

a eso me referia , bueno gatorv dejamos ya este tema cerrado , gracias por las aclaraciones las sugerencias y me has ayudado a aprender algo mas , yo nunca estudie nada

Etiquetas: conexion, mysli, poo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:03.