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

Por que no funciona esta interfaz?

Estas en el tema de Por que no funciona esta interfaz? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Que tal, espero que alguien me haga el favor de explicarme por que no puedo hacer correr el siguiente script. Resulta que si funciona tal ...
  #1 (permalink)  
Antiguo 12/03/2012, 22:22
 
Fecha de Ingreso: marzo-2012
Mensajes: 9
Antigüedad: 12 años, 1 mes
Puntos: 0
Por que no funciona esta interfaz?

Que tal, espero que alguien me haga el favor de explicarme por que no puedo hacer correr el siguiente script.

Resulta que si funciona tal como lo muestro:

index.php
Código PHP:


<?php


require_once 'conectordb.php';
require_once 
'managerdb.php';

class 
index
{
    public function 
run()
    {
        
$query "INSERT INTO animales (animal,stat) VALUES (3388,4)";
        
        
$conx = new conectordb();
        
$conx->conect();
        
$conx->query($query);
        
$conx->exe();
        
        
$q = new managerdb();
        
$q->testQuery($conx);
        
$conx->close();
        
        

    }
}

$test = new index();
$test->run();
interfacedb.php

Código PHP:
<?php

interface interfacedb
{
    public function 
exe();
    public function 
query($query);
    public function 
conect();
    public function 
close();
}
managerdb.php

Código PHP:
<?php
require_once 'interfacedb.php';

class 
managerdb
{
    public function 
testQuery(interfacedb $manager)
    {
        echo 
$manager->exe();
        
//mysql_query($manager->insert());
    
}
}
conectordb.php
Código PHP:
<?php

require_once 'interfacedb.php';

class 
conectordb implements interfacedb
{
    const 
USUARIO 'root';
    const 
PASS '';
    const 
SERVIDOR 'localhost';
    const 
DB 'dairyevents';
    
    private 
$_conexion;
    private 
$_query;
    
    public function 
conect()
    {
        
$this->_conexion mysql_connect(self::SERVIDOR,self::USUARIO,self::PASS);
        
mysql_select_db(self::DB,$this->_conexion);
    }
    public function 
query($query)
    {
        
$this->_query $query;
        
    }
    public function 
exe()
    {
        return 
$this->_query;
    }
    public function 
close()
    {
        
mysql_close($this->_conexion);
    }
    public function 
__toString()
    {
        return 
$this->query();
    }
}

Como dije, funciona bien pero cuando trato de quitar el metodo exe() para hacer todo desde el metodo query() me arroja el siguiente error:

Código PHP:
WarningMissing argument 1 for conectordb::query(), called in C:xampphtdocsimanagerdb.php on line 8 and defined in C:xampphtdocsiconectordb.php on line 20

Notice
Undefined variablequery in C:xampphtdocsiconectordb.php on line 22 
Esto lo arroja cuando cambio el codigo de la siguiente forma:

index.php
Código PHP:
<?php


require_once 'conectordb.php';
require_once 
'managerdb.php';

class 
index
{
    public function 
run()
    {
        
$query "INSERT INTO animales (animal,stat) VALUES (3388,4)";
        
        
$conx = new conectordb();
        
$conx->conect();
        
$conx->query($query);
        
//$conx->exe();
        
        
$q = new managerdb();
        
$q->testQuery($conx);
        
$conx->close();
        
        

    }
}

$test = new index();
$test->run();
conectordb.php
Código PHP:
<?php

require_once 'interfacedb.php';

class 
conectordb implements interfacedb
{
    const 
USUARIO 'root';
    const 
PASS '';
    const 
SERVIDOR 'localhost';
    const 
DB 'dairyevents';
    
    private 
$_conexion;
    private 
$_query;
    
    public function 
conect()
    {
        
$this->_conexion mysql_connect(self::SERVIDOR,self::USUARIO,self::PASS);
        
mysql_select_db(self::DB,$this->_conexion);
    }
    public function 
query($query)
    {
        
$this->_query $query;
        return 
$this->_query;
        
    }
    public function 
exe()
    {
        return 
$this->_query;
    }
    public function 
close()
    {
        
mysql_close($this->_conexion);
    }
    public function 
__toString()
    {
        return 
$this->query();
    }
}
managerdb.php
Código PHP:
<?php
require_once 'interfacedb.php';

class 
managerdb
{
    public function 
testQuery(interfacedb $manager)
    {
        echo 
$manager->query();
        
//mysql_query($manager->insert());
    
}
}
interfacedb.php
Código PHP:

<?php

interface interfacedb
{
    
//public function exe();
    
public function query($query);
    public function 
conect();
    public function 
close();
}

Solo quiero ahorrarme el metodo exe()... no logré dar con "el por que" solo pude hacer correr el script agregando el metodo exe pero no veo caso tenerlo ya que solo recibe y retorna como se darán cuenta... como se soluciona y lo mas importante... por que ???


Gracias !!
  #2 (permalink)  
Antiguo 12/03/2012, 22:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Por que no funciona esta interfaz?

Es por esto:
Código PHP:
Ver original
  1. <?php
  2. require_once 'interfacedb.php';
  3.  
  4. class managerdb
  5. {
  6.     public function testQuery(interfacedb $manager)
  7.     {
  8.         echo $manager->query();
  9.         //mysql_query($manager->insert());
  10.     }
  11. }

Según tu interfaz, el método query recibe un string y ahí no le estas pasando nada.

Saludos.
  #3 (permalink)  
Antiguo 13/03/2012, 07:36
 
Fecha de Ingreso: marzo-2012
Mensajes: 9
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Por que no funciona esta interfaz?

Agreguè la variable $query pero me dice que no està definida... no sè que mas tenga que modificar en las otras clases por que no corre el script....

Código PHP:
<?php
require_once 'interfacedb.php';

class 
managerdb
{
    public function 
testQuery(interfacedb $manager)
    {
        echo 
$manager->query($query); // <- agregando $query me dice que no està definida
        //mysql_query($manager->insert());
    
}
}
  #4 (permalink)  
Antiguo 13/03/2012, 10:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Por que no funciona esta interfaz?

Pues claro, ¿donde la defines? La idea es que recibas el query ahí, pe:
Código PHP:
Ver original
  1. public function testQuery(interfacedb $manager)
  2.     {
  3.         $query = "SELECT * FROM foo";
  4.         echo $manager->query($query); // <- agregando $query me dice que no està definida
  5.         //mysql_query($manager->insert());
  6.     }

Si solo pasas así query es una variable que no existe y por ende te marca error.
  #5 (permalink)  
Antiguo 13/03/2012, 13:47
 
Fecha de Ingreso: marzo-2012
Mensajes: 9
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Por que no funciona esta interfaz?

Si eso si lo entiendo... mira te lo voy a explicar mas claramente...

Esto me funciona muy bien:

index.php

Código PHP:
<?php

require_once 'pro.php';
require_once 
'pantalla.php';

class 
index
{
    public function 
run()
    {
        
$array = array('animal' => '1414''stat' => 'Gestante');        
        
        
$pantalla = new pantalla();
        
$txt = new texto($array'animales');
        
//$txt->setNombre('Maitee');
        
$txt->setTable('tratamientos');
        
$pantalla->showIt($txt);
    }
}

$haber = new index();
$haber->run();
pro.php
Código PHP:
<?php
require_once 'interfaceShow.php';

class 
texto implements interfaceShow
{
    private 
$_arrayData = array(), $_table$_mensaje;
    
    public function 
__construct($array$table)
    {
        
$this->_arrayData $array;
        
$this->_table $table;
    }
    public function 
show()
    {
        
$nuevo '';
        foreach(
$this->_arrayData as $clave => $valor){
            
$nuevo .= $clave." -> ".$valor."<br/>";
        }
        return 
$nuevo."<br/> Para la tabla ".$this->_table;;
    }
    public function 
setNombre($nombre)
    {
        
$this->_nombre $nombre;
    }
    public function 
setTable($table)
    {
        
$this->_table $table;
    }
    public function 
__toString()
    {
        return 
show();
    }
}
pantalla.php

Código PHP:
<?php
require_once 'interfaceShow.php';

class 
pantalla
{
    public function 
showIt(interfaceShow $mensaje)
    {
        echo 
$mensaje->show();
    }
}

<?php

Código PHP:
interface interfaceShow
{
    public function 
show();
    public function 
setNombre($nombre);
    public function 
setTable($table);


Si te das cuenta en la clase pantalla tengo el metodo showit y ahi mando llamar al metodo show() no le paso nada de variables y me imprime el mensaje... yo quiero usar solo show($mensaje) desde index y no funciona...

quiero algo como esto pero no funciona:

index.php
Código PHP:
<?php

require_once 'pro.php';
require_once 
'pantalla.php';

class 
index
{
    public function 
run()
    {
        
$array = array('animal' => '1414''stat' => 'Gestante');        
        
        
$pantalla = new pantalla();
        
$txt = new texto();
        
$txt->show($array,'usuarios');
        
$pantalla->showIt($txt);
    }
}

$haber = new index();
$haber->run();

Aun mas resumido... con los 4 archivos que tengo como puedo desde index usar el metodo show y mostrarlo en pantalla...
  #6 (permalink)  
Antiguo 13/03/2012, 15:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Por que no funciona esta interfaz?

Pues tendrías que cambiar tu clase texto para que en lugar de recibir esos parámetros por el constructor, los reciba directamente en el método show.

También tendrías que cambiar la interfaz para que en lugar de no aceptar parámetros acepte dos parámetros.

Solo así podrías ejecutar show directamente desde tu clase index.

Saludos.
  #7 (permalink)  
Antiguo 13/03/2012, 20:49
 
Fecha de Ingreso: marzo-2012
Mensajes: 9
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Por que no funciona esta interfaz?

Muchas gracias por ayudarme... mira lo que comentas sobre mandar los parametros por show() ya lo hice si te fijas en el ultimo codigo viene

Código PHP:
 $txt->show($array,'usuarios'); 
y ahi acepta los dos parametros y el constructor pues tambien lo quité...

Cambie todo el codigo tal cual comentas y sigue sin funcionar....estoy vuelto loco... es un codigo que hago como ejercicio, no lo quiero para nada mas que para saber POR QUE no corre y comprenderlo ya que estudiar por cuenta propio es bastante dificil y confuso ya que tengo que estar sacando conclusiones que no sé si son correctas... muchas muchas gracias...


Si pudieras correrlo y ver que pasa... ademas no entiendo por que dice que no están definidas las variables $array y $table en la clase texto, recibe los parametros y puedo imprimirlos pero aun asi dice que no están definidos...

index.php

Código PHP:
<?php

require_once 'pro.php';
require_once 
'pantalla.php';

class 
index
{
    public function 
run()
    {
        
$array = array('animal' => '1414''stat' => 'Gestante');        
        
        
$pantalla = new pantalla();
        
$txt = new texto();
        
$txt->show($array,'usuarios');
        
$pantalla->showIt($txt);
    }
}

$haber = new index();
$haber->run();
pantalla.php
Código PHP:
<?php
require_once 'interfaceShow.php';

class 
pantalla
{
    public function 
showIt(interfaceShow $mensaje)
    {
        echo 
$mensaje->show();
    }
}
interfaceShow.php

Código PHP:
<?php

interface interfaceShow
{
    public function 
show($array$table);
}
pro.php
Código PHP:
<?php
require_once 'interfaceShow.php';

class 
texto implements interfaceShow
{
    public function 
show($array$table)
    {
        
$nuevo '';
        foreach(
$array as $clave => $valor){
            
$nuevo .= $clave." -> ".$valor."<br/>";
        }
        return 
$nuevo."<br/> Para la tabla ".$table;
    }
    public function 
__toString()
    {
        return 
$this->show();
    }
}
  #8 (permalink)  
Antiguo 13/03/2012, 23:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Por que no funciona esta interfaz?

Estas haciendo los mismos problemas, todas las veces que mandas a llamar a $this->show() lo haces sin parámetros y claramente tu función necesita 2 valores $array y $table, ve tu método texto::__toString y pantalla::showIt().

En ambas mandas llamar a texto::show() pero lo haces sin las variables, lo cual te marca el error de que no están definidas.
  #9 (permalink)  
Antiguo 13/03/2012, 23:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Por que no funciona esta interfaz?

En pocas palabras:
Código PHP:
Ver original
  1. $pantalla = new pantalla();
  2.         $txt = new texto();
  3.         $txt->show($array,'usuarios'); // Bien aquí si estan definidas y sirve correctamente
  4.         $pantalla->showIt($txt); // Al llamar aqui, el programa entra aca:
  5.  
  6.  public function showIt(interfaceShow $mensaje)
  7.     {
  8.         echo $mensaje->show();  // Pero aqui no esta ni $array ni 'usuarios'
  9.     }

Espero que con eso veas porque no funciona y porque con tu primer script sí (donde tenías el constructor y guardabas las variables como miembros de la clase).

Saludos.
  #10 (permalink)  
Antiguo 14/03/2012, 05:38
 
Fecha de Ingreso: marzo-2012
Mensajes: 9
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Por que no funciona esta interfaz?

Lo siento sigue sin funcionar....
  #11 (permalink)  
Antiguo 14/03/2012, 09:16
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Por que no funciona esta interfaz?

Pues claro no va a funcionar, te estoy indicando donde es que tienes que cambiar el código, el código que te expongo no esta reparado ni mucho menos.

Como bien indicas, lo que tú quieres hacer es aprender, por eso te estoy indicando donde tienes el problema.

Saludos.
  #12 (permalink)  
Antiguo 17/03/2012, 14:56
 
Fecha de Ingreso: marzo-2012
Mensajes: 9
Antigüedad: 12 años, 1 mes
Puntos: 0
Respuesta: Por que no funciona esta interfaz?

Gracias por responder, efectivamente funciona... pero sigo con la duda del por que en el otro metodo sin pasar nada funciona... aun asi logré resolver el ejercicio...muchas gracias
  #13 (permalink)  
Antiguo 18/03/2012, 13:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Por que no funciona esta interfaz?

Funciona en el otro método porque guardas las propiedades en miembros de la clase, por eso cuando mandas llamar el método estos existen como propiedades de la clase, en la forma que lo quieres cambiar, no existen como propiedades, son variables locales que tienen que ser pasadas en cada llamada a tu clase.

Saludos.

Etiquetas: class, php
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 18:02.