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

Anidar objeto con objetos

Estas en el tema de Anidar objeto con objetos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Al crear un objeto, le passo cómo argumento el objeto $db que contiene la conexión a la base de datos, de esta manera: $act= & ...
  #1 (permalink)  
Antiguo 19/02/2005, 14:01
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 21 años
Puntos: 0
Anidar objeto con objetos

Al crear un objeto, le passo cómo argumento el objeto $db que contiene la conexión a la base de datos, de esta manera:

$act= & new activity($db);

Cómo hacer para no passar la conexión de la base de datos al objeto y que este lo coja automaticamente?

$act = $ new activity();

Havia pensado en poner un "global $db" en el constructor del objeto pero no me gusta, pq si cambian el nombre de la variable, se jodió el invento.
  #2 (permalink)  
Antiguo 19/02/2005, 17:27
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 3 meses
Puntos: 41
Si ya tienes un objeto $db instanciado... no veo qué te ahorraría el no pasarlo como parámetro. (¿tres caracteres?). Además de que, pasado como parámetro, deja el código más claro.

Yo optaría por pasarlo como parámetro... a menos que expliques un poco las razones de tu problema... tal vez sean buenas.

Saludos

Última edición por jpinedo; 19/02/2005 a las 17:56
  #3 (permalink)  
Antiguo 21/02/2005, 11:56
 
Fecha de Ingreso: marzo-2004
Ubicación: San José, Costa Rica
Mensajes: 234
Antigüedad: 20 años, 9 meses
Puntos: 0
Saludos,

Estoy de acuerdo con jpinedo, lo mejor creo es que lo pases como parémetro. Y sino, lo que yo hago para para algunos de estos casos es que le pongo un valor por defecto al parámetro.

Osea que, si la persona le pasa el parámetro, entonces usa ese valor y sino se lo pasan entonces usa el valor por defecto.

Para hacer debes poner algo así en la función:

function ejemplo($param = $db)
{
}

Pero como se te dijo lo mejor es pasar los parámetros asi logras que tu código sea más modular.

Saludos
__________________
Quieres una cuenta de Gmail?
Solo enviame un privado... :-)
  #4 (permalink)  
Antiguo 21/02/2005, 13:57
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 3 meses
Puntos: 41
Cita:
Iniciado por JosephFley
Estoy de acuerdo con jpinedo, lo mejor creo es que lo pases como parémetro. Y sino, lo que yo hago para para algunos de estos casos es que le pongo un valor por defecto al parámetro.

Osea que, si la persona le pasa el parámetro, entonces usa ese valor y sino se lo pasan entonces usa el valor por defecto.

Para hacer debes poner algo así en la función:

function ejemplo($param = $db)
{
}

Pero como se te dijo lo mejor es pasar los parámetros asi logras que tu código sea más modular.
Bueno... en este caso no se podría hacer lo que plantea JosephFley debido a que los parámetros por defecto deben ser valores constantes. No pueden ser varibles.
Puedes verlo en:
http://www.php.net/manual/es/functions.arguments.php
Busca el apartado "Parámetros por defecto".

Saludos
  #5 (permalink)  
Antiguo 22/02/2005, 09:13
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 23 años, 3 meses
Puntos: 6
Generalmente en las relaciones de dependencia, El objeto dependiente hace uso del independiente ya sea reciviendo el objeto como parametro o creando su instancia. Ahora me da la impresion que tu preocupacion va por el lado de compartir la instancia que creaste con todas las clases que puedan usarla en el periodo de tiempo de ejecucion del script para no tener instancias inecesarias. Para eso lee la documentacion relacionada con el patron Singleton que te permite garantizar que solo devolvera una sola instancia en su llamada y qu ete permite tener un punto. Para detalle puedes consultar las siguientes ligas:
http://www.phppatterns.com/index.php...cleview/6/1/1/
http://www.exciton.cs.rice.edu/JavaR.../singleton.htm

Tambien en algun mensaje del foro se trato el tema.
  #6 (permalink)  
Antiguo 22/02/2005, 22:00
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 21 años, 3 meses
Puntos: 41
Algo así se me ocurrió que podía necesitarse, simplemente no me quedaba tan clara la ventaja. Aunque ahora viéndolo bien... estaría muy bien aplicado.
Te dejo un enlace adicional en donde el mismo Herminio me explicó algo sobre ese patrón:
http://www.forosdelweb.com/f68/conocer-si-ha-instanciado-clase-262039/
Simplemente ten en cuenta que el ejemplo era para PHP5 y que habría que cambiar algunas cosas (como la visibilidad de los miembros y, claro, no asumir el paso por referencia).

Saludos
  #7 (permalink)  
Antiguo 23/02/2005, 07:32
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años, 1 mes
Puntos: 69
Este sería un ejemplo de un Singleton bien implementado para PHP4, teniendo en cuenta las referencias :
Código PHP:
<?php
class BaseDatos
{
    function &
instancia()
    {
        static 
$_instancia;
        if(empty(
$_instancia))
        {
            
$_instancia =& new BaseDatos();
        }
        return 
$_instancia;
    }
}

class 
ArtículoMapper
{
    function 
porId$id )
    {
        
$db =& BaseDatos::instancia();
        
$db->ejecutar('SELECT ... FROM tabla');
        
        
// etc
    
}
}
?>
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #8 (permalink)  
Antiguo 23/02/2005, 13:54
 
Fecha de Ingreso: noviembre-2003
Mensajes: 96
Antigüedad: 21 años, 1 mes
Puntos: 0
Tengo problemas con un objeto q me conecta a la BD

Hola a todos:

Tengo una clase q conecta con la BD, el objeto que instancio de la clase lo paso como variable de sesion pq voy a usarlo en la mayoria de las paginas, bueno la cosa es q en la primera pagina trabaja pero cuando lo llamo en otras paginas me sale este error:

Fatal error: Unknown(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition <b>conexion</b> of the object you are trying to operate on was loaded _before_ the session was started

La definicion de la clase y donde instancio el objeto de la misma es la siguiente:

CONEXIONBD.PHP
<?
class conexion{
//el constructor inicializa las variables de conexion
//la funcion conectar() hace la coneccion con la BD
}
session_start();

if (!isset($_SESSION['oconexion'])){

$_SESSION['oconexion'] = new conexion() ;
$_SESSION['oconexion']->conectar();
}
?>


y por ultimo en la pagina donde si funciona lo uso de la siguiente manera:

<?
include('conexionBD.php');
$_SESSION['oconexion']->conectar();
$r=$_SESSION['oconexion']->ejecutar('SELECT * FROM Categoria');

?>


y cuando trato de usar lo mismo en otras paginas sale el error que les mencione anteriormente.

Espero sus respuestas
Gracias
  #9 (permalink)  
Antiguo 23/02/2005, 14:50
 
Fecha de Ingreso: septiembre-2001
Ubicación: Monterrey
Mensajes: 663
Antigüedad: 23 años, 3 meses
Puntos: 6
Bueno cuando uasa serializacion la definicion de la clase que esta persistiendo, debe de estar disponible antes de que inicies la sesion, asi que el trozo de codigo que usas en la pagina que si funciona tienes que repetirlo en cada una de las paginas que vaya a hacer uso de esa clase.
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 02:31.