Porque no mejor heredas tu clase Db de la clase de PDO y te quitas así los problemas de usar return ya que a la hora de en tu constructor regresar otro objeto no se puede.
Saludos.
| ||||
Respuesta: Duda con PDO y mi clase Cita: No se como realizar la herencia de forma correcta, tengo una idea pero no está completa y mucho menos buena...
Código PHP:
Ver original Si sirve de referencia tengo una herencia de otro post que funciona muy bien. ¿Se puede aprovechar?
Código PHP:
Ver original Gracias de antemano
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Te recomiendo leer un poco sobre que es y como funciona la herencia, si solo le vas a pasar un parámetro que es el config tienes que declararlo de esa forma. |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Si he leído y visto tutoriales sobre la herencia, se trata de "sobreescribir" métodos que existen en la clase "padre".Pero no se seguir Se supone que estoy redeclarando el constructor de la clase PDO para que sea como hemos especificado anteriormente, que sea capaz de leer la variables del fichero .ini Y luego debe existir por algún lado la conexión PDO que no sé si se tiene que definir a parte tal y como está o se necesita algo más?
Código PHP:
Ver original
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Estas aplicando muy mal la herencia, mira este ejemplo:
Código PHP:
Ver original Si te fijas, al crear una instancia de Hija, es una instancia de Padre y le estamos pasando al constructor de padre los datos que quiere, tu tienes que hacer lo mismo una clase Db que acepte de parámetro un objeto config y que internamente llame al constructor de su clase padre con los datos que requiere. Saludos. |
| ||||
Respuesta: Duda con PDO y mi clase Cuando hice un cursillo de java nos dieron una lista aditiva de cuando se podría heredar, como una guía de cuando esta bien que se herede y que no se use por el mero hecho de reutilizar código... + Cuando está seguro de que cumple la relación ... es un ... p.ej.: un zafral no es un empleado (le faltan beneficios, no tiene aumentos de sueldo, etc.) + Cuando está seguro de que toda la funcionalidad heredada tiene sentido p.ej.: si “Documento” incluye un método “entregarMercadería” los “Recibos” no podrán heredar de dicha clase + Si la superclase es abstracta se heredarán varias subclases diferentes. p.ej.: si tubieramos una única clase de Mascota y fuera Perro no tendría sentido que se separaran en dos clases diferentes (Mascota – Perro). + Cuando el cuadro de clases obtenido tienen funcionalidades diferentes (respecto a la superclase y entre subclases) p.ej.: Si todas las especializaciones de Mascota “ladraran”, “hicieranPiruetas” y se “rascaranLasPulgas”, aunque fueran “Iguanas”, podrían representarse con la misma clase agregando un atributo “especie”. o Cuando piensa que tiene una especialización y nadie le dice que no (¡¡¡ buena suerte !!!) Y un enlace muy bueno de Enrique Saludos
__________________ "La imaginación es más importante que el conocimiento. El conocimiento es limitado, mientras que la imaginación no" -- A.Einstein objetivophp.com,twitter.com/objetivophp |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Así mejor? sobreescribo el constructor de PDO y luego dentro de él llamo a la clase padre con los datos que requiere mas el nuevo parámetro?
Iniciado por GatorV Estas aplicando muy mal la herencia, mira este ejemplo:
Código PHP:
Ver original Si te fijas, al crear una instancia de Hija, es una instancia de Padre y le estamos pasando al constructor de padre los datos que quiere, tu tienes que hacer lo mismo una clase Db que acepte de parámetro un objeto config y que internamente llame al constructor de su clase padre con los datos que requiere. Saludos.
Código PHP:
Ver original
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase ¿ O debería llamar al padre pasandole lo parámetros originales, es decir sin el Config? parent::__construct($dsn, $username="", $password="", $driver_options=array());
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Debes de llamar al constructor pasandole los parámetros que tu quieras definir, te dejo otro ejemplo más claro:
Código PHP:
Ver original Saludos. |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Ajam, entonces esta es la manera correcta de heredar en este caso, no?
Iniciado por GatorV Debes de llamar al constructor pasandole los parámetros que tu quieras definir, te dejo otro ejemplo más claro:
Código PHP:
Ver original Saludos.
Código PHP:
Ver original Utilizo esta llamada porque es la que aparece en la documentacion de PDO... parent::__construct($dsn, $username="", $password="", $driver_options=array()); ¿Es correcto? Gracias de antemano!
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase No, es incorrecto, por favor medita el ejemplo que te puse, al tu hacer esto:
Código PHP:
Ver original El interprete de PHP ve primero la asignacion dentro del paréntesis $bar = "" y asigna a $bar un valor vacio, posterioremente llama a foo. Te recomiendo leas un libro de PHP básico para que entiendes como es que se tienen que llamar las funciones y como hacer el paso de parámetros. Saludos! |
| ||||
Respuesta: Duda con PDO y mi clase Cita:
Iniciado por GatorV No, es incorrecto, por favor medita el ejemplo que te puse, al tu hacer esto:
Código PHP:
Ver original El interprete de PHP ve primero la asignacion dentro del paréntesis $bar = "" y asigna a $bar un valor vacio, posterioremente llama a foo. Te recomiendo leas un libro de PHP básico para que entiendes como es que se tienen que llamar las funciones y como hacer el paso de parámetros. Saludos! Creo que ahora te entiendo, precisamente, eso era lo que no me cuadraba, que tuviese que pasarle esos parametros: parent::__construct($dsn, $username="", $password="", $driver_options=array()); Sino mas bien los que toca que son ni mas ni menos que los que aparecen aqui, verdad? $this->_username = $config_data['username']; $this->_password = $config_data['password']; $this->_host = $config_data['host']; $this->_db = $config_data['db']; Sin embargo, mi duda es que no se poner en su sitio la variable $dsn, segun el ejemplo de PDO debería tener esta forma 'mysql:host=127.0.0.1;dbname=codelab' Debería hacerlo así, declarar una variable llamada $_dsn; $this->_$dsn="mysql:host=$this->_host;dbname=$this->_db"; parent::__construct($this->_$dsn, $this->_username, $this->_password); Mejor? :D
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Exacto ahora sí, te digo sería mucho mejor para ti y para que aprendas más que leas un libro de PHP, así puedes entender como funciona la sintaxis y como crear funciones y declarar los valores. Saludos. |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Entonces no hace falta que utilice el método Conectar() dentro de la clase no?
Código PHP:
Ver original Con esto sería suficiente no? <?php
Código PHP:
Ver original ejemplo1.php
Código PHP:
Ver original
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Así es, aunque como tip, yo no manejaría la excepcion de conectar dentro de tu clase DB, se la dejaría a la clase donde la implementas para que tengas un mejor control del flujo de tu aplicación. Saludos. |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Es decir, dentro de cada clase que implemente, en este ejemplo Categorias() y Partidos()?La clase MyPDO.class.php la dejarías así??
Código PHP:
Ver original No se de qué manera hacer para controlar la excepción dentro de la clase Categoria()
Código PHP:
Ver original ¿Puedes indicarme? Muchas gracias de antemano! PD: pongo el ejemplo para que se vea de donde sale el parametro que le paso a la clase...
Código PHP:
Ver original
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Donde implementes me refiero a donde estes usando las clases, por ejemplo:
Código PHP:
Ver original Así puedes controlar mucho mejor el flujo si se ocasiona algún problema o cachar diferentes tipos de excepciones. Saludos. |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Lo he añadido donde me comentas pero es como si no hiciese caso, ya que el mensaje de error que muestra no el "correcto".
Iniciado por GatorV Donde implementes me refiero a donde estes usando las clases, por ejemplo:
Código PHP:
Ver original Así puedes controlar mucho mejor el flujo si se ocasiona algún problema o cachar diferentes tipos de excepciones. Saludos.
Código PHP:
Ver original He modificado el nombre de la base de datos en el fichero de .ini por uno que no existe y me produce el siguiente error: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000] [1049] Unknown database 'code3lab'' in C:\wamp\www\00-laboratorio_test\secciones\class_categorias\Nueva\ ConectarCon2_BD_version2\MyPDO.class.php:25 Stack trace: #0 C:\wamp\www\00-laboratorio_test\secciones\class_categorias\Nueva\ ConectarCon2_BD_version2\MyPDO.class.php(25): PDO->__construct('mysql:host=loca...', 'root', 'jupiter') #1 C:\wamp\www\00-laboratorio_test\secciones\class_categorias\Nueva\ ConectarCon2_BD_version2\ejemplo1.php(59): MyPDO->__construct(Object(Config)) #2 {main} thrown in C:\wamp\www\00-laboratorio_test\secciones\class_categorias\Nueva\ ConectarCon2_BD_version2\MyPDO.class.php on line 25 La linea 25 hace de la clase MyPDO.class.php hace referencia a aquí parent::__construct($this->_dsn, $this->_username, $this->_password); ¿Por qué no captura correctamente la excepción? Ademas tengo puesto justo despues de la creación de los objetos de base de datos el setAttribute, por lo que el error tb debería ser diferente no? $db_slave = new MyPDO($config_slave); $db_slave->setAttribute(MyPDO::ATTR_ERRMODE, MyPDO::ERRMODE_EXCEPTION); $db_master = new MyPDO($config_master); $db_master->setAttribute(MyPDO::ATTR_ERRMODE, MyPDO::ERRMODE_EXCEPTION); ¿Sabes por qué?
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Pero pensaba que debía ser como el de clase PDO, si elimino el try y catch anterior y se lo pongo a la clase MyPDO así:
Código PHP:
Ver original El error es menos agresivo SQLSTATE[42000] [1049] Unknown database 'code3lab'Hubo un error Pensaba que quedaría así, pero si me comentas que no, que al poner el try y catch en:
Código PHP:
Ver original queda distinto, entonces es una pena...
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Si te fijas es el mismo error, mi comentario a manejar el try/catch en donde implementas es para que tu puedas controlar el flujo de tu código, si no se va aparar en el primer exit() y de nada sirve la excepción como tal. Ahora para que "repares" el error tienes que poner el nombre de la base de datos correcta, por eso te lanza la excepcion. |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Jejeje no nos entendiamos, para que el try y catch me mostrase el mismo error que si lo ponia dentro de la clase MyPDO, debía ponerlo no cuando creaba la Categoria sino antes, justo cuando hago la creación de la instancia de la base de datos.
Iniciado por GatorV Si te fijas es el mismo error, mi comentario a manejar el try/catch en donde implementas es para que tu puedas controlar el flujo de tu código, si no se va aparar en el primer exit() y de nada sirve la excepción como tal. Ahora para que "repares" el error tienes que poner el nombre de la base de datos correcta, por eso te lanza la excepcion. Aquí
Código PHP:
Ver original Y ahora sí, el error que produce era el que estaba intentando ver :D Me refiero que queda mostrado de la misma manera SQLSTATE[42000] [1049] Unknown database 'code3lab'Hubo un error Sin embargo, no consigo que el script termine y no siga mirando cuando no se puede crear la instancia si los datos de conexión no son validos. Ejemplo:
Código PHP:
Ver original El script muestra el error pero sigue ejecutandose fuera del TRY y CATCH, porque viene el setAttribute que claro, falla pq no se ha creado la instancia. Pero si funcionase el exit, no debería haber llegado al setAttribute no? SQLSTATE[42000] [1049] Unknown database 'cod3elab'Hubo un error Fatal error: Call to a member function setAttribute() on a non-object in C:\wamp\www\00-laboratorio_test\secciones\class_categorias\Nueva\ ConectarCon2_BD_version2\ejemplo1.php on line 59 ¿La pregunta es... por qué no finaliza el script dentro del CATCH si hay un exit? Gracias de antemano!
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Como te comento nuevamente, no me estas entendiendo tu puedes realizar todo dentro del mismo try para evitar eso precisamente, por ejemplo:
Código PHP:
Ver original Saludos. |
| ||||
Respuesta: Duda con PDO y mi clase Haciendolo como me decías me salia el mismo error y era pq en la clase MyPDO tenía tb un TRY CATCH, al quitarlo conseguí que funcionase! Yuhu! Por cierto, una última duda... Ahora mi clase MyPDO no utiliza ningún patrón singleton como hacia antes, ¿significa que se me pueden duplicar instancias sin que yo lo sepa, o al utilizar el Registry ya se encarga de alguna manera para que no se dupliquen instancias, aunque me temo que el Registry es simplemente para llevar eso un registro de instancias...? Pongo un ejemplo:
Código PHP:
Ver original Hasta aquí sería el proceso inicial que tengo que hacer para hacer toda la conexión... ¿no sé si se podría simplificar en una sola linea... en lugar de tener que poner siempre las 5, quizás una función? Luego hago uso de las clases que tenga en mi aplicación, las cuales hacen uso de la conexión a la bbdd, para ello les tengo que pasar en todas las clases la instancia de la conexión como parámetro, correcto? $cat= new Categoria($db_slave); $cat->listarCategorias(); ¿Existe alguna manera de duplicar conexiones de forma "errónea" o todo está creado de tal manera que si se intenta cargar otro conexión con los mismos parámetros que una que esté en uso, no se creará? me refiero a que si todo esta bien para utilizar la clase sin temor a tener instancias de bases de datos por ahí... (vamos lo que bien evita el singleton y que ya no implementa en la clase MyPDO...) Muchas gracias de antemano!
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| ||||
Respuesta: Duda con PDO y mi clase Por si solas no se pueden duplicar, es imposible, más bien tu vía código tienes que controlar eso, ¿como? usando el registro siempre, esa es tu tarea de programador. Ahora resumir todo eso en una sola línea? Pues puedes hacer otra clase que pasandole el parámetro del config cree el objeto y te regrese los datos, esa es precisamente la tarea del patrón Factory. De hecho ahora pensando podrías usar un patrón Factory con un cache interno y así omites tu Registry (o lo usas internamente), por ejemplo:
Código PHP:
Ver original Saludos. Última edición por GatorV; 03/09/2010 a las 16:27 |
| ||||
Respuesta: Duda con PDO y mi clase Cita: Será por patrones! madre mia! xDDDDDDDDDDDDDDDDD
Iniciado por GatorV Por si solas no se pueden duplicar, es imposible, más bien tu vía código tienes que controlar eso, ¿como? usando el registro siempre, esa es tu tarea de programador. Ahora resumir todo eso en una sola línea? Pues puedes hacer otra clase que pasandole el parámetro del config cree el objeto y te regrese los datos, esa es precisamente la tarea del patrón Factory. Este es el código final del ejemplo. Funciona perfecto.
Código PHP:
Ver original Saludos y mil gracias por las lecciones del hilo
__________________ Busco colaboradores que sepan PHP para proyecto apuestas. |
| |||
Respuesta: Duda con PDO y mi clase Bueno y para los que desconocen sobre este patrón o desean investigar: http://desarrolladorsenior.blogspot....y-en-php5.html |
| |||
Respuesta: Duda con PDO y mi clase Cita: Si te retorna la instancia PDO dentro del constructor de la clase, pero como un atributo privado.
Código PHP:
Ver original Esto imprimiría: Connected to database
Código PHP:
Ver original Por lo que tendrías que tener un método publico getConexion por ejemplo que te devuelva la instancia de PDO en vivo y poder utilizar posteriormente todos los métodos de PDO. Aunque como dice GatorV es mejor heredar de PDO directamente. |
| |||
Respuesta: Duda con PDO y mi clase Cita: Excelentes comentarios
Iniciado por portalmana Cuando hice un cursillo de java nos dieron una lista aditiva de cuando se podría heredar, como una guía de cuando esta bien que se herede y que no se use por el mero hecho de reutilizar código... + Cuando está seguro de que cumple la relación ... es un ... p.ej.: un zafral no es un empleado (le faltan beneficios, no tiene aumentos de sueldo, etc.) + Cuando está seguro de que toda la funcionalidad heredada tiene sentido p.ej.: si “Documento” incluye un método “entregarMercadería” los “Recibos” no podrán heredar de dicha clase + Si la superclase es abstracta se heredarán varias subclases diferentes. p.ej.: si tubieramos una única clase de Mascota y fuera Perro no tendría sentido que se separaran en dos clases diferentes (Mascota – Perro). + Cuando el cuadro de clases obtenido tienen funcionalidades diferentes (respecto a la superclase y entre subclases) p.ej.: Si todas las especializaciones de Mascota “ladraran”, “hicieranPiruetas” y se “rascaranLasPulgas”, aunque fueran “Iguanas”, podrían representarse con la misma clase agregando un atributo “especie”. o Cuando piensa que tiene una especialización y nadie le dice que no (¡¡¡ buena suerte !!!) Y un enlace muy bueno de Enrique Saludos Saludos. |
Etiquetas: |