Comunidad PHPeros
Lenguajes => PHP => (POO) Programación Orientada a Objetos => Mensaje iniciado por: Focux en 28 de Septiembre de 2010, 23:47:28 pm
-
Esta es una clase que hize para hacer multiples consultas con mysqli, esto me actualmente me está ahorrando mucho código en un proyecto que estoy llevando acabo, la clase se basa en una sola función ya que es para uso rapido y ahorrar espacio. El modo de uso es el siguiente:
<?PHP
require_once 'Nombre que le pusieron a la clase';
$contenido = queryManager::makeQuery("SELECT nick FROM msg ORDER BY id ASC LIMIT 2;SELECT time FROM msg ORDER BY id ASC LIMIT 2"); /* Esto les devolvera un array con otros array con los valores obtenidos, ejemplo, si queremos sacar los datos del primer select tendremos que hacer un foreach de $contenido['nick'], si en la consulta el campo se llama ejemplo algo, sería hacer un foreach a $contenido['algo'] para sacar los datos obtenidos.*/
foreach($contenido['nick'] as $values){
echo $values; }
?>
<?PHP
/*
_|_|_| _|_|_|_| _|_| _|_|_| _| _| _| _|
_| _| _| _| _| _| _| _| _|
_| _|_|_| _| _| _| _| _| _|
_| _| _| _| _| _| _| _| _|
_|_|_| _| _|_| _|_|_| _|_| _| _|
*/
class queryManager {
private static $host = 'host';
private static $user = 'usuario';
private static $pass = 'pass';
private static $db = 'basededatos';
private $query;
public static function makeQuery($query) {
$mysqli = new mysqli(self::$host, self::$user, self::$pass, self::$db);
if ($mysqli->connect_error) die('Problemas al establecer la conexion.<br/>CODIGO DE ERROR:' . $mysqli->connect_errno . '<br/>Detalles:' . $mysqli->connect_error);
$self->query = $query;
if ($mysqli->multi_query($self->query)) {
do {
if ($focux = $mysqli->store_result()) {
while ($mrfocux = $focux->fetch_assoc()) {
foreach($mrfocux as $key => $value) {
$datos[$key][] = $value;
}
}
$focux->close();
}
}
while ($mysqli->next_result());
return $datos;
$mysqli->close();
}
}
}
?>
-
te has equivocado? no será mysql?
-
te has equivocado? no será mysql?
Nop, esa es MySQLi
Me parece una excelente programación, impecable.
-
De POO solo tiene la sintaxis, porque a todos los efectos es una única función.
Saludos!
-
TLX creo que tienes un mal concepto de lo que es POO, no creo que eso sea tener más de una función, tambien deberías leer lo que puse allá arriba ''la clase se basa en una sola función ya que es para uso rapido y ahorrar espacio.'' y tampoco querría más funciones ya que esa función hace todo, sacar todos los datos y tambien mediante la consulta podrías saber la cantidad de filas si es lo que quieres saber.
-
No, no, créeme, no tengo un mal concepto de POO.
Si lees la teoría de la programación orientada a objetos, comprenderás que tu código no tiene mucho sentido hacerlo en POO. Principalmente porque hacer una clase de una clase no tiene sentido. (Haces una clase de mysqli, que es una clase)
Además me has entendido mal: Cuando he dicho función quería decir función (es decir, programación estructurada, una función de toda la vida: function Query() ) y no un método de clase. Pueden existir clases que tengan solo un método, y incluso clases que no tengan ninguno, pero este caso no es uno.
¿ Para que quieres una clase que solo tiene un método, y además su única función es esa ?
Quiero decir, ¿ cual es la ventaja de usar eso y no esto ?
<?PHP
require_once 'funciones.php';
$contenido = makeQuery("SELECT nick FROM msg ORDER BY id ASC LIMIT 2;SELECT time FROM msg ORDER BY id ASC LIMIT 2"); /
foreach($contenido['nick'] as $values){
echo $values; }
?>
Debo entender que tu clase es una clase estática, esta bien, algo es algo, por lo menos no la has instanciado (eso ya sería demasiado), pero sigue sin tener mucho sentido (por lo menos para mi punto de vista, lo que yo digo no es la opinión de todos, supongo)
Mira, buscando un poco, he encontrado un parrafo de la wikipedia que ha sabido expresar justamente lo que yo no he podido porque no encontraba las palabras:
http://es.wikipedia.org/wiki/Programaci%C3%B3n_orientada_a_objetos
En la programación estructurada sólo se escriben funciones que procesan datos. Los programadores que emplean POO, en cambio, primero definen objetos para luego enviarles mensajes solicitándoles que realicen sus métodos por sí mismos.
¿Ves la diferencia? Tu código es una clase, si, pero se asemeja mucho mas al modelo de programación estructurada (funcion procesa dato, en este caso query) que a POO (define objeto y luego hacen métodos).
No se si consigo explicarme.
Saludos!
-
Resalto esta parte del parrafo que buscaste ''funciones que procesan datos'', lo que hace mi clase es procesar la consulta y luego enviar una clase. Tambien me llamo mucho la atencion esto ''Haces una clase de mysqli, que es una clase'', obvio, me imagino que si crean la clase es para darle uso y te digo algo, yo podria tambien haber extendido la clase pero se me hizo mas facil hacerlo asi.
<?PHP
require_once 'funciones.php';
$contenido = makeQuery("SELECT nick FROM msg ORDER BY id ASC LIMIT 2;SELECT time FROM msg ORDER BY id ASC LIMIT 2"); /
foreach($contenido['nick'] as $values){
echo $values; }
?>
Con respecto a eso, la programacion orientada a objetos busca facilitar el trabajo al programador y hacer los codigos reutilizables, entonces si lo puse asi es porque yo lo puedo usar en cualquier momento y agregarles mas funciones, hasta el mismo que lo use si sabe de programacion lo puede hacer.
-
lo que hace mi clase es procesar la consulta y luego enviar una clase.
Eso es, procesa un dato (una consulta) y devuelve un array. Vamos, que procesa un dato y lo devuelve ya procesado.
Tambien me llamo mucho la atencion esto ''Haces una clase de mysqli, que es una clase'', obvio, me imagino que si crean la clase es para darle uso y te digo algo, yo podria tambien haber extendido la clase pero se me hizo mas facil hacerlo asi.
Si, estamos de acuerdo, MySQLi está hecho para que se use, y puedes usarlo de esta forma si quieres. Lo que intento decirte es que usarlo de esta forma en una clase no es ni efectivo, ni eficiente, ni útil. Es lo mismo que usarlo en una función. Lo que quiero decir es que tu definición de clase no tiene sentido.
Con respecto a eso, la programacion orientada a objetos busca facilitar el trabajo al programador y hacer los codigos reutilizables, entonces si lo puse asi es porque yo lo puedo usar en cualquier momento y agregarles mas funciones, hasta el mismo que lo use si sabe de programacion lo puede hacer.
En primer lugar, tu clase tiene poco de reutilizable (que por cierto como veo que sabes, es una base de la POO). Este fragmento:
private static $host = 'host';
private static $user = 'usuario';
private static $pass = 'pass';
private static $db = 'basededatos';
Es básicamente lo que lo convierte en no-reutilizable. En este caso la diferencia no es mucha porque solo hay que modificar 4 lineas. Pero si alguien quiere utilizarlo ya tiene que modificar la clase a mano. Lo correcto habría sido colocar esto en un constructor, y mediante el constructor asignar los valores.
Pero bueno, dejando este "matiz" de lado... ¿serias capaz de decirme cual es la ventaja de usar ese código y no este que pongo a continuación? Puedes razonarlo como quieras: reutilización, modificación, lo que quieras.
function makeQuery($query) {
$mysqli = new mysqli("TU HOST", "TU USUARIO", "TU PASS", "TU DB");
if ($mysqli->connect_error) die('Problemas al establecer la conexion.<br/>CODIGO DE ERROR:' . $mysqli->connect_errno . '<br/>Detalles:' . $mysqli->connect_error);
if ($mysqli->multi_query($query)) {
do {
if ($focux = $mysqli->store_result()) {
while ($mrfocux = $focux->fetch_assoc()) {
foreach($mrfocux as $key => $value) {
$datos[$key][] = $value;
}
}
$focux->close();
}
}
while ($mysqli->next_result());
return $datos;
$mysqli->close();
}
Créeme, son exactamente lo mismo. Usar una clase para esto no da ninguna ventaja.
¿Se puede usar? Claro que si, estas en tu derecho, puedes hacer lo que quieras, pero no te aporta nada útil, simplemente estas cambiando la sintaxis de función a clase, pero el modelo funcional (espero que entiendas lo que quiero decir con eso) es el mismo.
Me gustaría aclarar que mis mensajes son críticas totalmente con ánimo constructivo, y no de faltar, y si critico tanto el código es porque creo que se puede mejorar mucho, y pienso que puedo ayudarte al menos a comprender como funciona POO y como debería ser el código (o en este caso, como no debería ser) pero mi fin es únicamente ayudarte.
Saludos
-
Lo primero es que no se necesitan mas variables para agregar mas clases, con esas que ya hay puedes seguir utilizando el mysqli ya instanceado. ''¿serias capaz de decirme cual es la ventaja de usar ese código y no este que pongo a continuación?'', re***** lo anterior ''Con respecto a eso, la programacion orientada a objetos busca facilitar el trabajo al programador y hacer los codigos reutilizables, entonces si lo puse asi es porque yo lo puedo usar en cualquier momento y agregarles mas funciones, hasta el mismo que lo use si sabe de programacion lo puede hacer.''
-
Lo primero es que no se necesitan mas variables para agregar mas clases, con esas que ya hay puedes seguir utilizando el mysqli ya instanceado. ''¿serias capaz de decirme cual es la ventaja de usar ese código y no este que pongo a continuación?'', re***** lo anterior ''Con respecto a eso, la programacion orientada a objetos busca facilitar el trabajo al programador y hacer los codigos reutilizables, entonces si lo puse asi es porque yo lo puedo usar en cualquier momento y agregarles mas funciones, hasta el mismo que lo use si sabe de programacion lo puede hacer.''
Bueno, no se que quieres decir con eso de "no se necesitan mas variables para agregar mas clases", tendrás que explicarte un poco mejor. Yo no he agregado ninguna variable, si no que mas bien lo que proponía era usar LAS MISMAS VARIABLES, pero darles un mejor uso usando un constructor, con lo que ya consigues que sea un poco mas reutilizable.
Respecto a lo segundo: si, esa es la una propiedad de la POO, y eso se aplica a un código orientado a objetos, pero yo sigo diciendo, que tu código del primer post tiene poco de POO (llámame pesado, pero es lo que hay). Lo que te pido es que me muestres específicamente cual es la diferencia, y que hace mejor un código respecto al otro. Ejemplo: Mi clase... blablabla, en cambio tu función: blablabla. El único fin de pedirte esto, es que veas que no hay ninguna diferencia de uso entre las dos, sino simplemente de sintaxis.
Saludos
-
Mejor vamos a dejarlo aqui porque si seguimos sera una discusion sin fin, que siga el tema.
-
No entiendo a la gente que no quiere discutir, para mi la discusión es la base del conocimiento, pero bueno, que no lo entienda no significa que no lo respete, si quieres dejarlo ahí pues ahí se deja.
Un saludo
-
Buenas,
Me voy a meter a la discusión para intentar explicar lo que dice TLX, que desde mi punto de vista, tiene razón.
Focux lo que has hecho es generar una clase a la que has llamado "queryManager" que ejecuta la conexión de mysqli y resuelve un query que quieres procesar.
TLX te intenta decir esto:
Que eso no es POO. ¿Por qué? Porque estás procesando datos en una clase como si fuera una función...
No tiene sentido & mucho menos lógica hacer la resolución de datos de una clase a través de otra clase... porque lo que haces es llamar a una clase, que llama a otra que es la que realiza la función...
Un ejemplo exágerado sería:
function llamar($variable) {
exec($variable);
}
function ejecutar($codigo) {
llamar($codigo);
}
print ejecutar("free -m");
Sería algo similar referido a una función, a ver si así lo entiendes jejeje.
Llamas a una función con otra función que procesa esa función...
Mi pregunta... ¿Por qué no hacerlo directamente?
¿Cómo? Evitando procesar otra clase más, en este caso "queryManager" y usar directamente mysqli.
No es facilidad al programador, porque así haces el código más lioso y una latencia de proceso mayor.
Espero que me haya explicado bien !
& digo lo mismo que TLX, todo esto es constructivo para nada destructivo & mucho menos para joder.
Un abraaaaaaazote :D
-
Sé nota que no sabes lo que estás hablando, porque POO no depende de si tienen una sóla función, si quieres te puedo buscar mas de 10 clases muy útiles que dependen de más funciones, en cualquier momento me avisas, además hace poco necesitaba algo más para el proyecto & re hize la clase, luego la posteo.
-
Sé nota que no sabes lo que estás hablando, porque POO no depende de si tienen una sóla función, si quieres te puedo buscar mas de 10 clases muy útiles que dependen de más funciones, en cualquier momento me avisas, además hace poco necesitaba algo más para el proyecto & re hize la clase, luego la posteo.
Focux.. Fede solo esta dandote un ejemplo... Lo que quiere decir es que hacer una clase de una clase es como hacer una función de una función!
No tiene sentido! Es reiterativo, es como si yo ahora programo una función que se llama "eco" así:
function eco($var) {
echo $var;
}
Por darte un ejemplo.. ¿Para que voy a usar eco() si puedo usar echo() directamente y hacen exactamente lo mismo? Para nada.
Y no solo eso, sino que ya te he dicho que tu clase puede escribirse como una función, y por lo tanto no tiene nada de clase.
Una clase, que se ejecuta como una función, no tiene sentido. Ya te hize tu transformación clase-función y como ves es exactamente lo mismo.
Y por cierto, ahora que esta muy de moda eso de decir "No, esque programo en POO porque así el código es reutilizable". El código reutilizable no es nada nuevo, lleva existiendo desde hace mucho tiempo. Las funciones, de hecho, en su mayoria, son código reutilizable.
Saludos!
-
Exaaaaacto!
No nos entiende TLX ! jajajajajaja
-
Si hubieras heredado MySQLi a tu nueva clase, quizás pudo ser más interesante...
-
Focux.. Fede solo esta dandote un ejemplo... Lo que quiere decir es que hacer una clase de una clase es como hacer una función de una función!
No tiene sentido! Es reiterativo, es como si yo ahora programo una función que se llama "eco" así:
function eco($var) {
echo $var;
}
Por darte un ejemplo.. ¿Para que voy a usar eco() si puedo usar echo() directamente y hacen exactamente lo mismo? Para nada.
Y no solo eso, sino que ya te he dicho que tu clase puede escribirse como una función, y por lo tanto no tiene nada de clase.
Una clase, que se ejecuta como una función, no tiene sentido. Ya te hize tu transformación clase-función y como ves es exactamente lo mismo.
Y por cierto, ahora que esta muy de moda eso de decir "No, esque programo en POO porque así el código es reutilizable". El código reutilizable no es nada nuevo, lleva existiendo desde hace mucho tiempo. Las funciones, de hecho, en su mayoria, son código reutilizable.
Saludos!
La poo es para disminuir el trabajo del programador, no es lo mismo poner todo ese código, que sólo poner una función.
-
La poo es para disminuir el trabajo del programador, no es lo mismo poner todo ese código, que sólo poner una función.
Mi función es mas pequeña que tu clase. 18 lineas mi función y 27 lineas tu clase (sin contar los comentarios obviamente).
Aún no veo en qué disminuye el trabajo de un programador tu clase. Parece que sabes muy bien que ventajas tiene POO pero eres incapaz de ver esas ventajas en tu propio código y aprovecharte de ellas.
Esa clase no es POO, es una "función camuflada" (por llamarlo de alguna manera), aunque tu no quieras verlo.
Yo ya te he dado varios argumentos sobre por qué son las cosas así y como funcionan, y FeDe tambien, incluso Physlet te ha comentado que su heredas mysqli alomejor podías hacer algo interesante. Pero sin embargo tu solo te remites a las ventajas de POO y a sus principios, que todos conocemos pero que sin embargo en tu código no están aplicados.
No quieres verlo, pero bueno, solo queremos ayudarte a programar correctamente en POO.
Saludos
-
Lo que tu no entiendes es que hay cientos de clases que solo tienen una funcion, y son mas util de lo que parece, ademas de que se hace con sentido de que el que la va utilizar pueda editar la clase facilmente, como quiera como dije en el primer post, necesitaba algo mas que eso & modifique la clase, & se me hizo facil por lo que te explique anteriormente.
-
Lo que tu no entiendes es que hay cientos de clases que solo tienen una funcion, y son mas util de lo que parece, ademas de que se hace con sentido de que el que la va utilizar pueda editar la clase facilmente, como quiera como dije en el primer post, necesitaba algo mas que eso & modifique la clase, & se me hizo facil por lo que te explique anteriormente.
Y yo ya te he dicho en un post anterior que es cierto, que hay clases que solo tienen un método (función) y son correctas, y también hay clases que no tienen ningún método y también son correctas, pero este no es el caso.
Si necesitabas algo mas y modificaste la clase, entonces a lo mejor la nueva clase tiene algo de sentido (habrá que verla, si es que la pones al público) pero en este caso concreto, no es el caso.
-
Me puse a analizar un poco la clase, y no le veo sentido tener que conectar a la base de datos cada vez que quieres hacer una consulta. Pienso que pudo ser mejor si la conexión la haces desde afuera de la clase (programa principal) y por algún método 'asignar' enviar por parámetro el objeto de la clase MySQLi.
Y tampoco tiene sentido el uso que le has dado al atributo $query o al menos así lo veo yo.
PD: Lo más correcto no es asignarle los valores directo desde la declaración de los atributos, sino mediante el constructor.
-
Eso era para un script que necesitaba que la conexión se haga solamente al hacer la consulta, pero todo cambio, en un minuto público la nueva clase de un script que estoy haciendo.
EDITO:
No importa lo de asignarles valores directo, almenos que sea una función que lleve como valor o vallas a extraer los datos desde afuera de la clase.
-
No importa lo de asignarles valores directo, almenos que sea una función que lleve como valor o vallas a extraer los datos desde afuera de la clase.
No es que no importe, todos los lenguajes permiten hacerlo, pero no es lo más correcto, ya que para eso se ha inventado el constructor. Eso sí, para las constantes sí se debe hacer por lógicas razones.
-
No es que no importe, todos los lenguajes permiten hacerlo, pero no es lo más correcto, ya que para eso se ha inventado el constructor. Eso sí, para las constantes sí se debe hacer por lógicas razones.
Desde cuando vez que esa clase esta pasando por un constructor?, ademas, el constructor sirve para los parametros que necesitas extraer de afuera de la clase.. muy obvio eso.
-
Desde cuando vez que esa clase esta pasando por un constructor?, ademas, el constructor sirve para los parametros que necesitas extraer de afuera de la clase.. muy obvio eso.
No, porque para traer datos desde afuera de la clase, también existen los métodos que en pseudocódigo se llaman 'asignar', no es necesario utilizar el constructor solo para esto, ya que si necesitas cambiar valores en los atributos luego de haber creado el objeto, ¿qué harías? Usar un método para asignar valores, no volver a crear el constructor.
Sí, ya me dí cuenta que tampoco creas objetos aquí, a diferencia del otro sí lo pasaste porque eran constantes, pero en este caso no eran constantes y por eso lo decía.
-
Primeramente.. si necesito cambiar el valor a algun atributo lo puedo hace asi, $objeto->nombreAtributo = 'nuevo contenido' , los metodos pseudocodigos se utilizan cuando el atributo es privado. Asi que no digas que no es correcto dar valores a un atributo directamente, alrevez lo veo muy util esto.
-
Primeramente.. si necesito cambiar el valor a algun atributo lo puedo hace asi, $objeto->nombreAtributo = 'nuevo contenido' , los metodos pseudocodigos se utilizan cuando el atributo es privado. Asi que no digas que no es correcto dar valores a un atributo directamente, alrevez lo veo muy util esto.
Como no me gusta repetir cosas, te citaré algo que comentó TLX sobre eso:
¿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.
Con set se refiere a los 'asignar' de lo que te comenté.
-
Se a que se refiere set, he usado esos metodos pero para atributos privados como te dije, si necesito hacerlo a un atributo publico no hay problemas de volverle a asignar el nombre desde afuera.. Comentando sobre lo que dijo TLX que no habia leido, si quisiera hacer eso, son mas adecuadas las interfaces que las abstractas.
-
Se a que se refiere set, he usado esos metodos pero para atributos privados como te dije, si necesito hacerlo a un atributo publico no hay problemas de volverle a asignar el nombre desde afuera.. Comentando sobre lo que dijo TLX que no habia leido, si quisiera hacer eso, son mas adecuadas las interfaces que las abstractas.
Todo depende del uso y lógica que le des. Pero lo que te digo es que lo más correcto es que sólo se deba asignar un atributo público cuando realmente sea necesario hacerlo, son casos excepcionales, pero de que te lo permite el lenguaje, lo permite, pero no es lo más correcto.
-
Obvio que sólo se debe asignar cuando sea necesario.. pero volvemos al punto, vuelves & dices que no es lo correcto, solo dame una razon porque no, porque lo incorrecto puede ser que consuma mas memoria o cualquier otro conflicto que tenga, pero que yo sepa no es asi..
-
El caso es que private se inventó precisamente para eso, para usarlo y saberlo diferenciar.
Si te fijas, en "funcionalidad" private no es necesario, puesto que con public puedes hacer lo mismo.
Es una cuestión mas bien de organización que de otra cosa.
Los atributos de las clases que no quieres que se editen se declaran private para eso mismo.
Normalmente todo esto esta pensado para gente que trabaja en grupo, de forma que si alguien diseña una clase y luego otra persona la usa, si esta segunda persona intenta cambiar un atributo privado, le salte error y así no se continue la ejecución.
Como ya digo, es más cuestión de organización que de otra cosa.
Normalmente se suelen declarar public atributos que vas a necesitar leer desde fuera de la clase, pero sobre todo que vas a poder modificar desde fuera de la clase.
Es lo mismo tener una variable public que declararla private y luego hacer un get() y un set() para esa variable, pero sin embargo no es lo mismo que declararla private y solo hacer un get() por ejemplo, porque te evitas que alguien pueda editar ese dato, y alomejor a ti te interesa que así sea.
Que te digo yo... alomejor estas sacando nombres de usuario de una BD y declaras la array donde los guardas como private, y luego colocas un get().
Te interesa leer los nombres, pero para nada te interesarian que esos nombres se modifiquen, porque te podrían corromper la BD.
Saludos!
-
Se de que hablas & se las caracteristicas de un atributo publico & privado, ya anteriormente habia buscado si existia el ''onlyread'' como existe en otros lenguajes pero no me encontre otra solucion que hacer una funcion ''get''.