Comunidad PHPeros
Lenguajes => PHP => (POO) Programación Orientada a Objetos => Mensaje iniciado por: Warlox en 11 de Mayo de 2010, 02:20:04 am
-
¡Hola PHPeros!
Bueno, como ahora estoy desarrollando un proyecto de una comunidad virtual (TribuAvatar), me he visto en la necesidad de crear una clase para mostrar los datos de la tabla "usuarios". Como la pude hacer, y por lo visto me ha quedado bien, es corta y sencilla, les paso el código para ahorrarles futuros problemas.
<?php
class usuario
{
# Declaro las variables que serán la consulta a la base de datos y el resultado del mysql_fetch_array
private $consulta;
private $fetch;
# Interpreto y asigno los valores a las variables pasadas por los parámetros de la clase
function __construct($xIdusuario)
{
$this->consulta = mysql_query("SELECT * FROM usuarios WHERE id = '".$xIdusuario."'");
$this->fetch = mysql_fetch_array($this->consulta);
}
# Y con esta función muestro los datos
function mostrar($xDato)
{
return $this->fetch[$xDato];
}
}
?>
Ahora bien, para mostrar los datos lo hago desde la siguiente manera:
<?php
# Llamo a la clase con los datos del usuario que tiene el ID #1
$usuario = new usuario(1);
# Ahora, simplemente muestro los datos
echo "Nombre ".$usuario->mostrar("nombre")."<br>";
echo "Correo ".$usuario->mostrar("correo");
# Y se pueden seguir mostrando más columnas...
?>
Ahora vamos con algo un poco más complejo; cambiar de forma dinámica el nombre de la tabla a mostrar, así como elegir parámetros, etcétera.
class consultarTabla
{
# Declaro las variables que serán la consulta a la base de datos y el resultado del mysql_fetch_array
private $consulta;
private $fetch;
# Interpreto los datos enviados por los parámetros de la clase
function __construct($xTabla, $xParametros)
{
$this->consulta = mysql_query("SELECT * FROM ".$xTabla." ".$xParametros."");
$this->fetch = mysql_fetch_array($this->consulta);
}
# Y con esta función muestro los datos
function mostrar($xDato)
{
return $this->fetch[$xDato];
}
}
?>
Si no se quieren especificar los parámetros para la consulta (WHERE X=Y, etc...) se debe poner un "@" al principio del llamado a la clase, esto para que no muestre el error de "Missing Argument".
<?php
$usuarios = @new consultarTabla("usuarios");
echo $usuarios->mostrar("usuario");
?>
Si se quisiera consultar la tabla con argumentos:
<?php
$usuarios = new consultarTabla("usuarios","WHERE id = '1'");
echo $usuarios->mostrar("usuario");
?>
Eso es todo, espero que les sirva, cualquier duda que tengan me la ponen acá mismo (como una respuesta al post) ;).
Saludos.
-
En la primera clase, yo usaría eval para que las variables fueran $clase->variable, por comodidad simplemente.
Y en la segunda... me parece un desperdicio una clase solo para un SELECT, al menos para cualquier query, vale...
-
En la primera clase, yo usaría eval para que las variables fueran $clase->variable, por comodidad simplemente.
Ya habíamos probado con el eval y no funcionaba como esperábamos, ¿te acuerdas?
Y en la segunda... me parece un desperdicio una clase solo para un SELECT, al menos para cualquier query, vale...
Pues yo veo más simple y rápido hacer:
$noticia = new consultarTabla("noticias","WHERE id = '1'");
echo $noticia->mostrar("titulo");
A hacer esto:
$sql = mysql_query("SELECT * FROM noticias WHERE id = '1'");
$sql = mysql_fetch_array($sql);
echo $row["titulo"];
Pero en fin, como te dije ese es mi punto de vista, y obviamente, cada programador tiene un punto de vista más o menos diferente al de los otros xD.
-
Pero yo prefiero hacer
new consulta("SELECT..", "UPDATE")...
que new select("tabla", "algo"); new update("tabla", "algo");
Y el eval... con una @ se solucionaba :P
-
¿A que os referís con usar eval?
No se si os referís a llamar directamente desde fuera de la clase a las variables así:
echo $noticia->fetch['titulo'];
En este caso no necesitas eval, simplemente colocar a $fetch como public, aunque no te lo recomiendo.
En POO existe el principio de abstracción (busca un poco de información sobre él si quieres), que dice que una clase debe definirse a si misma y debe contener todos los métodos y variables que necesita, y ella misma se modificará y se adaptará, exepto en los casos en que necesita estrictamente pasarle como parametro otra clase o algo similar.
Normalmente lo que se suele hacer es un método Get (como en tu caso, mostrar) y un metodo Set para cada variable.
Tu clase esta bien, aunque se puede mejorar, sobre todo la forma de plantearla.
Normalmente, y como truco, la clase es un sustantivo, las variables son adjetivos, propiedades o cualidades, o almacenadores para guardar algo, y los metodos son las acciones que ese sustantivo puede realizar. Por eso no te aconsejo crear una clase para cada función en la BD como haces. Así acabarás teniendo class consultarTabla, class escribirTabla, class contarTabla... Como ves todas tienen en común el hecho de que son acciones que se hacen en una BD, y como acciones que son, te recomiendo que sean métodos, y no clases. La clase sería la propia base de datos.
Por ejemplo:
class MySQL {
private $con;
private $fetch;
function __construct() { // Aqui conectas con la BD y lo guardas en $con }
public function consultar($tabla, $sentencia = 0) {
// En pseudocodigo:
// Si $sentencia = 0
// Hacer mysql_query("SELECT * FROM ".$tabla, $con);
// Si $sentencia != 0
// Hacer mysql_query("SELECT * FROM ".$tabla." ".$sentencia, $con);
// Guardar resultado en $fetch
}
public function mostrar($que) {
return $this->fetch[$que];
}
public function insertar($queinserto) { // Con esta función insertas en la bd... }
}
No se si me explico, son formas diferentes de definir clases. Si la defines como lo estabas haciendo acabarás con muchas clases pequeñitas, y con esto consigues una sola clase mas funcional.
Acuérdate:
- Sustantivos -> Clases
- Adjetivos, propiedades, contenedores -> Variables
- Acciones que puede realizar el sustantivo -> Métodos
Espero haberte ayudado y que me hayas entendido :)
Saludos!
-
Por eval me refiero a poder usar $clase->nombre, $clase->email, etc... por simple vageza :P
-
No entiendo que tiene que ver eval con eso, no lo capto jaja
Saludos!
-
Creo quiere decir que en vez de $this->fetch[algo]; sea $this->alo
-
quedaría algo asi
class usuario {
function __construct($id) {
$query = query...
$fetch = mysql_fetch_assoc($query);
foreach($fetch as $key=>$value) {
@eval('$this->'.$key.' = ('.gettype($value).') \''.$value.'\';');
}
}
}
Y así usaríamos
$usuario = new usuario(1);
echo 'Hola '.$usuario->nick;
-
Entiendo, no me parece mala idea, pero aún así ya te digo, yo soy mas partidario de usar un método Get para mostrar variables, y además de esa forma no tendrías en la declaración de la clase las variables que coge de la BD.
Pero aún así, no hay duda de que lo que propones es una opción muy interesante y con utilidad, no la había pensado, gracias :)
Saludos!
-
Se me olvidó la otra vez preguntar sobre esto...
Que significa el '->' ese que usan siempre con $this-> ??
No lo pillo bien, gracias de antemano..
-
A ver, la "variable" (no se si llamarla así) $this hace referencia al propio objeto que estamos ejecutando.
Para comprender esto es necesario saber diferenciar clase y objeto, pues aunque pueda paracerlo, no son la misma cosa.
Izquierda->Derecha quiere decir que Derecha pertenece a Izquierda, por lo tanto $this->nombre hace referencia a la variable nombre del objeto donde ponemos esa sentencia. $alumno->mostrar() hace referencia el método mostrar del objeto $alumno.
No se si ha quedado claro,
Saludos!
-
A ver, la "variable" (no se si llamarla así) $this hace referencia al propio objeto que estamos ejecutando.
Para comprender esto es necesario saber diferenciar clase y objeto, pues aunque pueda paracerlo, no son la misma cosa.
Izquierda->Derecha quiere decir que Derecha pertenece a Izquierda, por lo tanto $this->nombre hace referencia a la variable nombre del objeto donde ponemos esa sentencia. $alumno->mostrar() hace referencia el método mostrar del objeto $alumno.
No se si ha quedado claro,
Saludos!
Lo que pasa es que yo estoy estudiando la POO de manera teórica sin aplicar ningún lenguaje, entonces se me hacía raro.
Creo que ya sé a qué te refieres, por ejemplo estamos dando Algoritmos en POO, y en el programa principal aparece:
obj_nombre.pasa_valor(val1,val2), por decir un ejemplo. Entonces ese -> representaría al punto y el $this al obj_nombre (que le puse ese nombre para identificarlo nada más xD)...
Se me hace muy aburrido estudiar algoritmos y eso sin poder aplicarlo a ningún lenguaje de programación, pero bueno es la metodología que está aplicando mi profesora... Muchas gracias TLX :D
-
Sin duda lo mejor es primero estudiar la metodología y la teoría de POO.
Luego lo agradecerás a la hora de ponerte a practicar, ya lo verás.
Y si, -> en PHP es equivalente a . en Java, por ejemplo. Recuerda que todos los carácteres especiales dependen del lenguaje que utilices, así que, aunque normalmente suelen ser iguales o parecidos, en algunos lenguajes cambia.
Saludos!