Foros del Web » Programando para Internet » PHP »

PHP OO Manejando Clases en php

Estas en el tema de Manejando Clases en php en el foro de PHP en Foros del Web. Cordial Saludo. Estoy programando y me entro una duda, ¿cual de las siguientes formas de utilizacion de clases es mas eficiente y utiliza menos recursos ...
  #1 (permalink)  
Antiguo 22/03/2014, 01:12
 
Fecha de Ingreso: noviembre-2007
Mensajes: 10
Antigüedad: 16 años, 5 meses
Puntos: 0
Información Manejando Clases en php

Cordial Saludo.

Estoy programando y me entro una duda, ¿cual de las siguientes formas de utilizacion de clases es mas eficiente y utiliza menos recursos y conexiones?
Agradeceria mucho su ayuda.

NOTA 1: todos mentodos de las clases existen asi no esten definidos.
NOTA 2: Cada clase esta en un archivo distinto

FORMA 1:
Código PHP:
// bd.php
class bd {
    public 
$l;
    function 
__construct() {
        
$this->mysql_connect(...)
        ...
    }
    function 
consulta($sql) {
        
$this->l->mysql_query(...);
        ...
    }
}

// ip.php
class ip {
    function 
get_ip() { ... }
}

// usuario.php
class usuario extens bd {
    function 
crear_usuario($usr) {
        
$this->consulta("sentencia sql");
        ...
        
$ip ip::get_ip();
    }
}

// sesion.php
class sesion extends bd {
        function 
registrar_sesion($usuario) {
            
$this->consulta("sentencia sql");
            ...
            
$ip ip::get_ip();
        }
}

// index.php
require 'bd.php';
require 
'ip.php';
require 
'usuario.php';
require 
'sesion.php';

$usu = new usuario();
$ses = new ses(); 
FORMA 2:
Código PHP:
// bd.php
class bd {
    public 
$l;
    function 
__construct() {
        
$this->mysql_connect(...)
        ...
    }
    function 
consulta($sql) {
        
$this->l->mysql_query(...);
        ...
    }
}

// ip.php
class ip {
    function 
get_ip() { ... }
}

// usuario.php
class usuario {
    private 
l;
    function 
__construct($link) {
        
$this->$link;
    }
    function 
crear_usuario($usr) {
        
$this->l->consulta("sentencia sql");
        ...
        
$ip ip::get_ip();
    }
}

// sesion.php
class sesion {
    private 
l;
    function 
__construct($link) {
        
$this->$link;
    }
        function 
registrar_sesion($usuario) {
            
$this->l->consulta("sentencia sql");
            ...
            
$ip ip::get_ip();
        }
}

// index.php
require 'bd.php';
require 
'ip.php';
require 
'usuario.php';
require 
'sesion.php';

$bd = new bd();
$usu = new usuario$bd );
$ses = new ses$bd ); 
Quiero saber cual de las dos es mas eficiente.
Hablando con un amigo, me dijo que a el le parecia que de la FORMA 1, cada clase hija de bd creaba una conexion a la base de datos, mientras que la FORMA 2, solo creaba 1 y la compartia, asi que la FORMA 2 era las eficiente.
O ¿cual otra forma me recomiendan?

De antemano gracias por su ayuda.
  #2 (permalink)  
Antiguo 22/03/2014, 04:29
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Manejando Clases en php

La primera manera es simplemente incorrecta, puede funcionar, pero no tiene sentido que esas clases hereden de mysql, su relación es de uso no padre-hijo.
Ej: el objeto "gato" puede heredar de la clase "animal", pero no tiene sentido que herede de la clase "cama" aunque use una cama para dormir.
Ej: el objeto "coche" puede heredar de la clase "Vehiculo" pero no tiene sentido que herede de la clase motor, aunque use uno para poder moverse.

El método correcto es parecido al segundo, pero se puede hacer de manera más sencilla sin tener que ir pasando por parametro el link a mysql, busca "patron singleton", es un patrón para poder acceder a la clase mysql sin tener que reinstanciarla en cada clase (o sin tener que pasarlo por parametro)

Un saludo
  #3 (permalink)  
Antiguo 24/03/2014, 15:33
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Manejando Clases en php

Lo que se recomienda es que inyectes las clases de las cuales depende Usuario. Para tu caso la clase mysqli y la que te proporciona la ip, similar a tu segunda opción. Con esa idea y como ejemplo puedes modificar por ejemplo el metodo registrar_sesion

Código PHP:
Ver original
  1. function registrar_sesion($usuario) {
  2.             $this->l->consulta("sentencia sql");
  3.             ...
  4.             $ip = ip::get_ip();
  5.         }
Por:
Código PHP:
Ver original
  1. function registrar_sesion($usuario, $ip) {
  2.             $this->l->consulta("sentencia sql");
  3.             $this->ip = $ip->get_ip();
  4.         }

Cita:
El método correcto es parecido al segundo, pero se puede hacer de manera más sencilla sin tener que ir pasando por parametro el link a mysql, busca "patron singleton", es un patrón para poder acceder a la clase mysql sin tener que reinstanciarla en cada clase (o sin tener que pasarlo por parametro)
Se recomienda sustituir el uso del patrón singleton por la inyección de dependencias, ya que el primero mete mas problemas que los que soluciona.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #4 (permalink)  
Antiguo 24/03/2014, 16:13
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Manejando Clases en php

Cita:
Iniciado por hhs Ver Mensaje
Se recomienda sustituir el uso del patrón singleton por la inyección de dependencias, ya que el primero mete mas problemas que los que soluciona.
Puedes decirme porque motivos es mejor pasar por parametro a cada metodo el objeto con la conexion a la base de datos en vez de usar singleton? He usado singleton mil veces y ningún problema, simplemente es más sencillo que estar pasando 4 o 5 parametros a cada metodo. Porque se puede tener un objeto mysql, otro para log, otro si necesitas usar una API externa, etc.

¿Por que motivo Singleton no es una buena opcion?
  #5 (permalink)  
Antiguo 24/03/2014, 17:09
lolainas
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Manejando Clases en php

Singleton no es una buena opción en un proyecto donde se usa más de un datasource, que pasa si quisiera conectar a varias bases de datos?
  #6 (permalink)  
Antiguo 24/03/2014, 18:41
Avatar de Heli0s  
Fecha de Ingreso: abril-2010
Mensajes: 789
Antigüedad: 14 años
Puntos: 40
Respuesta: Manejando Clases en php

Cita:
Iniciado por lolainas Ver Mensaje
Singleton no es una buena opción en un proyecto donde se usa más de un datasource, que pasa si quisiera conectar a varias bases de datos?
Estoy deacuerdo, Singleton se trata de usar una única instancia, pero eso sucede la menor parte de las veces.

Un saludo
  #7 (permalink)  
Antiguo 25/03/2014, 21:47
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Manejando Clases en php

Cita:
Iniciado por Heli0s Ver Mensaje
Puedes decirme porque motivos es mejor pasar por parametro a cada metodo el objeto con la conexion a la base de datos en vez de usar singleton? He usado singleton mil veces y ningún problema, simplemente es más sencillo que estar pasando 4 o 5 parametros a cada metodo. Porque se puede tener un objeto mysql, otro para log, otro si necesitas usar una API externa, etc.

¿Por que motivo Singleton no es una buena opcion?
Pues te lo dire de esta forma. Imagina que comes una galleta, después de que la boca tritura la galleta, deglutes el bolo alimenticio que llega al estomago y este ultimo procesa el bolo alimenticio para convertirlo en el quimo. Este es mas o menos el proceso natural de comer una galleta.
Ahora imagina que no puedes masticar, así que te meten una sonda por el esófago y alguien hace pasar un bolo alimenticio hasta el estomago. Pues bien, esto ultimo es similar a lo que haces cuando usas un singleton. En otras palabas su uso hace que destruyas la encapsulación y ocultes dependencias entre otras cosas.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: clases, mysql, sql
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 18:58.