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

Duda con llamadas a las bases de datos y otras cosas xD

Estas en el tema de Duda con llamadas a las bases de datos y otras cosas xD en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos: Estoy metiendome con ésto de las clases en PHP (se prgramar en Java, pero usando archivos de texto, aun sin DBs) Mi ...
  #1 (permalink)  
Antiguo 01/06/2009, 12:31
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Duda con llamadas a las bases de datos y otras cosas xD

Hola a todos:

Estoy metiendome con ésto de las clases en PHP (se prgramar en Java, pero usando archivos de texto, aun sin DBs)

Mi duda es la siguiente. tengo una clase DataBase con varios métodos (conectar, desconesctar, consultar, limpiar...etc), que en las pruebas unitarias me funciona bien.
Sim embargo, el asco que tengo a los includes me persigue a todos los lados .Como no se si existen 'packages' o cosas por el estilo, incluyo mi clase conexion "a pelo" en otras clases. Intentando hacer un sistema de users sencillo, hago lo siguiente:

Código PHP:
<?php

//incluyo la clase

include('bd.php');

class 
User{

   private 
$user;
   private 
$pass;
   
//bueno, aqui todo el resto de atributos

   //llamo a la clase db
   
$db=new DataBase();

   function 
User($u,$p)
   {
      
$this->user=$u;
      
$this->pass=$p;
      
//etc..
   
}
   function 
Register()
   {            

      
$query="INSERT INTO usuario VALUES ('$this->user','$this->pass',etc..)";
      
     
$this->db->execute($query);
     
$this->db->free();
     
$this->db->close();
}

....
....
sigue con m&#225;s métodos 
   
}
Mis preguntas:

1-Es correcto? Es decir, si yo quiero usar mi clase DB en otras 20 clases distintas a User, no me darán problemas? Aunque las instancie entre sí?

2- Éstas lineas ($this->db->close();). He visto que el uso del 'this' está muy extendido en el PHPOO. quizá tengo malas costumbres del Java (aparte que el no tener que declarar el tipo de atributo y método me despista). Tiene algo de especial en PHP? Os parecera una pregunta estúpida, pero es que a mi me despista un poco. Si fuese java, yo el this me lo hubiese fumao. Pasaría algo en el funcionamiento de la aplicación si hubiese puesto ($db->close();)?

3-es preferible usar include, require_once, o require, cuando estamos hablando de PHPOO?

4-Es recomendable dejar los atributos públicos, o hacerlos privados y petar la clase de getters y setters?. Se que en Java el encapsulamiento es muy útil. Supongo que dotará de una mayor seguridad la aplicación..

5- para que sirve el símbolo ::? (no sé c++..lo digo pq creo haberlo visto por ese lenguaje)

6- hay alguna manera de "crear" packages? o existe algo parecido?

7- (se me olvidaba)Es correcto limpiar el resultado y cerrar la conexion despues de cada consulta?

Bueno, de momento, mi sed de dudas se saciará si algún sabio me responde a éstas.

muchas gracias por adelantado.
  #2 (permalink)  
Antiguo 01/06/2009, 12:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Duda con llamadas a las bases de datos y otras cosas xD

1.- Es mejor usar require_once, las razones son, require te genera un error fatal si no existe la clase, lo cual es lo necesario si tu clase depende de esa otra clase. El _once ayuda a solo incluirla una vez y evitar errores como "class db already defined in..".

2.- En PHP es necesario el uso de $this->, o de lo contrario el interprete de PHP no va a reconocer que te refieres a la clase, si no a una variable local.

3.- Ve el punto 1.

4.- Tanto en Java, como en PHP, y como en todos los lenguajes OO, lo mejor siempre es encapsular tu clase y usar setters/getters.

5.- Es para hacer llamadas a métodos estaticos de una clase, en PHP se le conoce como Paamayim Nekudotayim, en el Manual de PHP puedes ver más información.

6.- En PHP6 existen los PARs que son como los JARs de Java.

7.- No, el Garbage Collector de PHP se encarga de cerrar la conexión, limpiar el resultado solo es recomendado si tu query va a utilizar muchos recursos y quieres liberarlos para limpiar memoria.

Saludos.
  #3 (permalink)  
Antiguo 01/06/2009, 13:07
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: Duda con llamadas a las bases de datos y otras cosas xD

Muchas gracias GatorV. No me quedará otra que usar el dichoso this..
Aunque la 1, no me ha quedado clara ( es decir, pillé que es recomendable usar el _once..xD)

Si tengo un par de clases, que se necesitan entre si..(Room necesita a User y db y a su vez User necesita DB)..

Código PHP:
require_once('bd.php');

class 
User{
...
   
$db=new DataBase();
...

y
Código PHP:
require_once('bd.php');
require_once(
'user.php');

class 
Room{
...
   
$user=new User(loquesea,loquesea);
   
$db=new DataBase();
...

Debería retirar el require_once('bd.php'); de Room?..o el propio require_once se encarga de no volver a llamarse?..Al menos eso es lo que entiendo con tu respuesta 1...
Es decir, supongo que funcionarán como los imports de Java..

Muchas gracias por tu ayuda!
  #4 (permalink)  
Antiguo 01/06/2009, 13:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Duda con llamadas a las bases de datos y otras cosas xD

En efecto el _once hace que no se incluya más que una vez el archivo, por lo que no importa si lo llamas en otro lado el _once se encarga de solo incluirlo una vez.

Saludos.
  #5 (permalink)  
Antiguo 02/06/2009, 08:29
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: Duda con llamadas a las bases de datos y otras cosas xD

Vaya una dudita más:

No se pueden usar objetos como atributos privados de una clase?

algo como

private $bd = new BD();

y usarlo en los métodos mas o menos:

$this->bd->Conecta() etc etc.

Me lanza un error como este: Parse error: syntax error, unexpected T_NEW.

En cambio si instancio el objeto en cada método, sí que me deja usarlo... Aunque ésto en otro lenguajes sería bastante poco eficiente...

Hay alguna manera de usar un objeto como propiedad privada de la clase?
  #6 (permalink)  
Antiguo 02/06/2009, 09:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Duda con llamadas a las bases de datos y otras cosas xD

Claro que es posible hacerlo, pero tienes que instanciarlo en el constructor:
Código php:
Ver original
  1. class foo {
  2.        private $_bar;
  3.    
  4.        public function __construct() {
  5.                 $this->_bar = new bar();
  6.        }
  7.  
  8.        public function baz() {
  9.                 echo $this->_bar->baz();
  10.        }
  11. }

Saludos.
  #7 (permalink)  
Antiguo 02/06/2009, 11:56
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: Duda con llamadas a las bases de datos y otras cosas xD

Ok, gracias de nuevo
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 00:47.