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

Opinion sobre mis primeras clases POO

Estas en el tema de Opinion sobre mis primeras clases POO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, hace una semana mas o menos empeze con la programacion POO en PHP5 y he realizado mis primeras clases, a ver si alguien con ...
  #1 (permalink)  
Antiguo 15/11/2012, 09:49
 
Fecha de Ingreso: octubre-2012
Ubicación: Austria
Mensajes: 47
Antigüedad: 11 años, 6 meses
Puntos: 7
Opinion sobre mis primeras clases POO

Buenas, hace una semana mas o menos empeze con la programacion POO en PHP5 y he realizado mis primeras clases, a ver si alguien con buenos conocimientos sobre poo me pueda dar su opinion mas sincera!!( la 1 ya me la miraron pero haria falta para la pongo xk esta asociada a la 2nd )

Clase 1

Código PHP:
class database {
    private 
$host;
    private 
$user;
    private 
$password;
    private 
$database;
    private static 
$resultsql;
    public static 
$instance;
    public static 
$connectlink;


    private function 
__construct() { }

    public static function 
getInstance() {
        if (!isset(
self::$instance)) {
            
$db __CLASS__;
            
self::$instance = new $db;
        }
        return 
self::$instance;
    }
    public function 
connect($host,$user,$password,$database){
        
$this->host $host;
        
$this->user $user;
        
$this->password $password;
        
$this->database $database;

        
self::$connectlink mysql_connect($this->host,$this->user,$this->password);

        if(!
self::$connectlink) {
            throw new 
Exception('A db connection is needed');
        }
        else {
            
mysql_select_db($this->database);
        }
    }
    public static function 
sql($q) {
        
self::$resultsql mysql_query($q);
        return 
self::$resultsql;
    }
    public function 
disconnect() {
        @
mysql_close($this->connectlink);
    }
    public function 
__clone() {
        throw new 
Exception('Clone are not allowed');
    }


Clase 2

Código PHP:
class user {

    private 
$user;
    private 
$password;
    private 
$result;
    private 
$email;
    private 
$iduser;

    public function 
__construct($user,$password,$email="") {

        if (!isset(
database::$connectlink)) {
            throw new 
Exception('A db connection is needed for instance this class');

        } else {
            
$this->user $user;
            
$this->password $password;
            
$this->email $email;
        }
    }

    public function 
validateuser() {

        
$validate database::sql("select * from USER where 
            USERNAME = '"  
mysql_real_escape_string($this->user) . "'
            AND PASSWORD = '" 
mysql_real_escape_string(MD5($this->password)) ."'");
        if (
mysql_num_rows($validate) > 0
        { 
            
mysql_free_result($validate);
            return 
true;
        }else {
            
mysql_free_result($validate);
            return 
false;
        }
    }
    public function 
checking(){
        
$validate_user database::sql("select * from USER where 
            USERNAME = '"  
mysql_real_escape_string($this->user) . "'
            OR EMAIL = '" 
mysql_real_escape_string($this->email) ."'");

        if (
mysql_num_rows($validate_user) > 0
        { 
            
mysql_free_result($validate_user);
            return 
true;
        }else {
            
mysql_free_result($validate_user);
            return 
false;
        }
    }

    public function 
createuser() {
        if(
$this->checking()) {
            throw new 
Exception('The user exist or email already exist!');

        } else { 
            
database::sql("INSERT INTO USER ( USERNAME,PASSWORD, EMAIL)
                VALUES ( '"  
mysql_real_escape_string($this->user) . "' , '" mysql_real_escape_string(MD5($this->password)) ."' , '" mysql_real_escape_string($this->email) ."') ");
        }
    }

    public function 
get_iduser() {
        
$this->result database::sql("SELECT ID_USER from user where 
            USERNAME = '"  
mysql_real_escape_string($this->user) . "'
            and PASSWORD = '" 
mysql_real_escape_string(MD5($this->password)) ."'");

        while(
$row mysql_fetch_array($this->result)) {
            
$this->iduser $row['ID_USER'];
        }
        return 
$this->iduser;
    }

Muchisimas gracias de antemano!
  #2 (permalink)  
Antiguo 15/11/2012, 10:21
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: Opinion sobre mis primeras clases POO

1.- No uses singleton, es considerado un AntiPattern, es mucho mejor Inyección de Dependencias, o un Registro (aunque mejor usa la inyección de dependencias para que aprendas bien desde un inicio).
2.- La extensión MySQL esta deprecada usa mejor PDO, o MySQLi.
3.- Si estas usando puras funciones estaticas, realmente no estas usando POO, ya que es lo mismo que usaras funciones normales, si vas a usar POO usa realmente objetos.

Saludos.
  #3 (permalink)  
Antiguo 15/11/2012, 15:44
 
Fecha de Ingreso: octubre-2012
Ubicación: Austria
Mensajes: 47
Antigüedad: 11 años, 6 meses
Puntos: 7
Respuesta: Opinion sobre mis primeras clases POO

Muchas gracias por tu respuesta! El problema que tengo esque necesito hacer query´s en la clase user, pero la idea de tener que crear un nuevo objeto database para ejecutar el metodo sql no me hace mucha gracia! Tambien pense en extender a clase USER los metodos de la clase database pero parace que va encontra de los conceptos de disenio de poo, tu que opinas?

Un Saludo
  #4 (permalink)  
Antiguo 15/11/2012, 16:49
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: Opinion sobre mis primeras clases POO

El que tengas que usar Querys es independiente, yo te hablo de la relación directa en la clase Usuario/Database, lo correcto es que pases la dependencia directamente al iniciar la clase:
Código PHP:
Ver original
  1. $db = new Database(/* blah */);
  2. $user = new User();
  3. $user->setDb($db);

Saludos.
  #5 (permalink)  
Antiguo 16/11/2012, 06:30
 
Fecha de Ingreso: octubre-2012
Ubicación: Austria
Mensajes: 47
Antigüedad: 11 años, 6 meses
Puntos: 7
Respuesta: Opinion sobre mis primeras clases POO

Hola de nuevo, si te he entendido bien te refieres a esto?

Clase
Código PHP:
class validations {
    private 
$user;
    private 
$password;
    private 
$db;

    public function 
__construct($user,$password) {
        
$this->user $user;
        
$this->password $password;
    }

    public function 
set_db($db) {
        
$this->db $db;
    }
    public function 
validateuser() {
        if(!isset(
$this->db)) { 
            throw new 
Exception('You have to call method set_db before!');

        } else {
            
$stmt $this->db->prepare("select * from USER where 
                USERNAME = '"  
mysqli_real_escape_string($this->db,$this->user) . "'
                AND PASSWORD = '" 
mysqli_real_escape_string($this->db,MD5($this->password)) ."'");
            
$stmt->execute();
            
$result $stmt->store_result();

            if ((
$stmt->num_rows) > 0
            { 
                return 
true;
                
$stmt->free_result();
            }else {
                return 
false;
                
$stmt->free_result();

            }
        }
    }


Código PHP:
$conexion = new mysqli($dbhost,$dbuser,$dbpassword,$database);
$nuevavalidacion = new validations("oliver","oliver");
$nuevavalidacion->set_db($conexion);
$nuevavalidacion->validateuser(); 
Muchas gracias de nuevo por tu ayuda, no sabes cuanto te lo agradezco

Un saludo!
  #6 (permalink)  
Antiguo 16/11/2012, 06:59
 
Fecha de Ingreso: octubre-2012
Ubicación: Austria
Mensajes: 47
Antigüedad: 11 años, 6 meses
Puntos: 7
Respuesta: Opinion sobre mis primeras clases POO

y si no me equivoco, ahora me faltara implementar un patron para que no cree miles de conexiones a la bd, van x ahi los tiros??
  #7 (permalink)  
Antiguo 16/11/2012, 10:33
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: Opinion sobre mis primeras clases POO

Así es, y para eso puedes usar un ServiceLocator/Dependency Injection Container, o un Registro, de donde obtengas tu conexión.

Por otro lado, no es necesario el else, si ya estas lanzando la excepción, queda más limpio el código así:
Código PHP:
Ver original
  1. public function foo() {
  2.        if (!$this->bar) {
  3.               throw new Exception(/* *);
  4.        }
  5.  
  6.        // stuff
  7. }
  #8 (permalink)  
Antiguo 16/11/2012, 10:33
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: Opinion sobre mis primeras clases POO

Este es un buen ejemplo de de un DI Container pero puedes usar el que quieras.

Saludos.
  #9 (permalink)  
Antiguo 16/11/2012, 12:14
 
Fecha de Ingreso: octubre-2012
Ubicación: Austria
Mensajes: 47
Antigüedad: 11 años, 6 meses
Puntos: 7
Respuesta: Opinion sobre mis primeras clases POO

buenooooo, despues de mucho sufrimiento creo haber conseguido algo "aceptable" gracias a tus consejos!

Clase de Ejemplo
Código PHP:
class user {
    private 
$user;
    private 
$password;
    private 
$email;
    private 
$db;
    public function 
__construct($db) {
        
$this->db $db;
    }

    public function 
create_user($user,$password,$email){
        
$this->user $user;
        
$this->password $password;
        
$this->user $user;

        
$checking_user = new check($this->db);
        if(
$checking_user->check_user($this->user)) {
            throw new 
Exception('The user exist already');
        }else {

            
$stmt $this->db->prepare("INSERT INTO USER ( USERNAME,PASSWORD, EMAIL)
             VALUES ( '"  
mysqli_real_escape_string($this->db,$this->user) . "' , '" mysqli_real_escape_string($this->db,MD5($this->password)) ."' , '" mysqli_real_escape_string($this->db,$this->email) ."') ");
            
$stmt->execute();
        }
    }


Implementacion

Código PHP:
$conexion = new mysqli($dbhost,$dbuser,$dbpassword,$database); 
Registry::add('Conexion'$conexion);  
$user1 = new user(Registry::get('Conexion'));
$user1->create_user("oliver","oliver","ssdds"); 
Un saludo maquina!! Espero algun dia poder devolverte el favor jeje
  #10 (permalink)  
Antiguo 16/11/2012, 12:55
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: Opinion sobre mis primeras clases POO

Exacto, es mucho mejor ese camino y es más limpio, aunque lo mejor realmente es un ServiceLocator / Dependency Injection Container.

¡Saludos!

Etiquetas: clase, clases, php, 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 05:48.