Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Frameworks y PHP orientado a objetos (http://www.forosdelweb.com/f68/)
-   -   Llamar a metodo de una clase desde el metodo de otra clase (http://www.forosdelweb.com/f68/llamar-metodo-clase-desde-metodo-otra-clase-309034/)

lorecasas 18/06/2005 09:34

Llamar a metodo de una clase desde el metodo de otra clase
 
Hola Foro:

Tengo un problema aqui, tengo un metodo en una clase, en ese metodo quiero llamar a un metodo de otra clase, pero no se como hacer si no lo hago desde un objeto. Algo asi:


class Articulo{
var $Id;
var $Nombre;
var $IdMenu;
function MuestraArticulo($IdArticulo){
$this -> Id = $IdArticulo;
$SQL = "SELECT ID, Nombre, IdMenu FROM ARTICULOS WHERE ID = ".$this -> Id";
$resul = mysql_query($SQL, $_SESSION['cnx']);
while( $fila = mysql_fetch_array( $resul ) ) {
echo $fila['ID'];
echo $fila['Nombre'];
echo MuestraNombre($fila['IdMenu']);
}

}

//Clase de donde saco el nombre del menu
class Menu{
var $Id;
var $Nombre;
function MuestraNombre($IdMenu){
$this -> Id = $IdMenu;
$SQL = "SELECT Nombre FROM MENUS WHERE ID = ".$this -> Id";
$resul = mysql_query($SQL, $_SESSION['cnx']);
while( $fila = mysql_fetch_array( $resul ) ) {
return $fila['Nombre'];
}

}

Lo que quiero es poder obtener el nombre del menu desde otra clase, llamando al metodo correspondiente de la clase Menu desde la clase donde lo necesito.

Gracias, ojala alguien me pueda dar una idea de como hacer esto, podria hacer una funcion aparte, solo asi se me ocurre pero ya no usaria el metodo que existe para esto en la clase Menu, que es lo que quiero hacer,


Gracias!!

Atte. Lore :adios:

Webstudio 18/06/2005 10:21

Hola Lore,

Lo que vos querés es, de alguna manera, utilizar información de una clase, para el funcionamiento de otra clase. Eso no es muy complicado, si utilizamos bien las ventajas que nos ofrecen los objetos.
Por lo que pude entender de tu clase, vos querés que un Artículo, muestre un Menu determinado? :S Bueno, te comento que lo mejor, es que los Objetos no tengan "lógica de presentación", o sea, que mantengas tus objetos libres de "echos", y asi poder mantener todo separado y limpio. Yo haría lo siguiente (errores de sintaxis más o menos):

Código PHP:

<?
class Articulo
{
    var 
$Id;
    var 
$Nombre;
    var 
$IdMenu;

    function 
Articulo$id )
    {
        
$this->Id $id;
        if(empty(
$this->Nombre) || empty($this->IdMenu))
        {
            
$this->cargar();
        }
    }
    
    function 
cargar()
    {
        
$SQL "SELECT ID, Nombre, IdMenu FROM ARTICULOS WHERE ID = ".$this->Id;
        
$resul mysql_query($SQL$_SESSION['cnx']);
        
$fila mysql_fetch_array$resul );
        
$this->Nombre $fila['Nombre'];
        
$this->IdMenu $fila['IdMenu'];
    }
    
    function 
mostrar()
    {
        echo 
$this->Id;
        echo 
$this->Nombre;
    }
}

//Clase de donde saco el nombre del menu
class Menu
{
    var 
$Id;
    var 
$Nombre;

    function 
Menu$id )
    {
        
$this->Id $id;
        if(empty(
$this->Nombre))
        {
            
$this->cargar();
        }
    }
    
    function 
cargar()
    {
        
$SQL "SELECT Nombre FROM MENUS WHERE ID = ".$this->Id;
        
$resul mysql_query($SQL$_SESSION['cnx']);
        
$fila mysql_fetch_array$resul );
        
$this->Nombre $fila['Nombre'];
    }

    function 
mostrar()
    {
        echo 
$this->Nombre;
    }
}

// Y asi es como se utilizaría
$art    = new Articulo(1);
$menu = new Menu($art->IdMenu);
$art->mostrar();
$menu->mostrar();
?>

Saludos y espero que te sirva.

jpinedo 18/06/2005 10:32

Hola Lorena:

Si fuera el caso de que un artículo tiene un menú (¿?), entonces debe tener como atributo un objeto de la clase Menu. En el constructor instancias un Menu y lo guardas en $this->menu.
Luego puedes acceder a los métodos de Menu a través de ese objeto.
Pero la verdad es que la relación natural entre Artículo y Menú no la veo del todo clara.
Tal vez sea mejor trabajar los objetos por separado.

Saludos:adios:
PD: Trata de quitar todos los "echo". Puedes utilizar un sólo método que imprima en pantalla.

DarioDario 18/06/2005 12:00

si no mal tengo entendido para llamar una funcion de otra clase bastas con hacer asi...
Código PHP:

class saludo
{
 function 
nombre($nombre)
{
echo 
"Hola ".$nombre."<br>";
}
//end funcion
}//end class

class yo
{
function 
yo ($nombre)
{
saludo::nombre($nombre);   //---- Esta es la forma de llamar una funcion de otro class
echo "Te saluda DarioDario.<br>";
}
//end funcion
}//end class

$unavariable = new yo("Gabriel"); 

obviamente este no es un ejemplo muy practico pero la idea creo que esta bien clara... para llamar la funcion de otro class basta con poner el nombre_class::function();... espero q les sirva de algo... saludos, ahhh esto es bajo PHP 4, nose si sera igual para PHP 5, la aclaracion queda echa ;-)...

Webstudio 18/06/2005 13:26

DarioDario, tu solución es para llamar a un método "DE CLASE" de un objeto. Si tu método, por ejemplo, tuviera un $this, ya no funcionaría y daría error. Vale la aclaración para no generar confusiones.

DarioDario 18/06/2005 17:46

perdonenme, no hace mucho empiezo con esto de los objetos, gracias por la aclaracion Webstudio, y perdonen la confucion que pude haber generado...

lorecasas 20/06/2005 09:31

Foro:


No estoy muy segura, pero creo que de todo lo que me comentaron, JPinedo se acerca mas a lo que quiero hacer. Jpinedo dice que:

Cita:

Pero la verdad es que la relación natural entre Artículo y Menú no la veo del todo clara.
De hecho, serian 2 objetos separados, solo que menu tiene un id y un nombre, y metodos para pasando por parametro un ID de menu, obtener el nombre de este.

Articulo es otra clase, que tiene un ID, un nombre de articulo y un id de menu, que representa el menu donde el articulo se encuentra, quiero en mi clase Articulo, por medio de un metodo, pasarle por parametro el ID del articulo que quiero, y me muestre el nombre del articulo, y, en lugar de mostrarme el id del menu donde esta, me muestre el nombre de este menu, es decir, acceder al metodo de menu, desde la clase articulo, Jpinedo comenta que:

Cita:

debe tener como atributo un objeto de la clase Menu. En el constructor instancias un Menu y lo guardas en $this->menu.
Podrias darme un ejemplo de esto en codigo JPinedo? muchas gracias...



Atte. Lore :adios:

lorecasas 20/06/2005 10:19

las ultimas dudas
 
Ya quedo como tu decias JPinedo, es exacto lo que necesitaba, solo me queda la duda de dos comentarios que me hiciste:

Cita:

Pero la verdad es que la relación natural entre Artículo y Menú no la veo del todo clara. Pero la verdad es que la relación natural entre Artículo y Menú no la veo del todo clara.
Tal vez sea mejor trabajar los objetos por separado.
la explique en el Post anterior, espero haberme explicado.

y el otro comentario:

Cita:

Trata de quitar todos los "echo". Puedes utilizar un sólo método que imprima en pantalla.
mmm, aqui utilizaria un metodo como el que usa WebStudio en el script que el mandó no?


Gracias JPinedo! Atte Lorena :-)

jpinedo 20/06/2005 16:47

Hola Lore:

Sobre la relación entre ambos objetos... si tú ves claro que un menú es un atributo de un artículo... entonces todo está bien.
Lo que pasa es que yo no termino de entender qué es un menú (disculpa la brutalidad).

Tal como lo explicas parece que sí puede haber una relación natural de pertenencia entre ambos... pero sería al revés. O sea, un menú que contiene artículos y no un artículo que contiene menúes.

Como te digo, es una decisión tuya. Tú sabes cómo funciona tu aplicación. Lo que debes tratar es de reflejar la realidad lo mejor posible. No está mal que lo hagas com lo has hecho.

-------------

Sobre lo de suprimir los "echo's", sí... hay que hacer algún método de salida como lo que planteó Webstudio.

Saludos:adios:


La zona horaria es GMT -6. Ahora son las 19:59.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.