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

Problema con Interface

Estas en el tema de Problema con Interface en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, revisando viejos mis viejos archivos deJAVA(que seguí de manera autodidacta) encontré un diagrama de clases(que por cierto es básico), cuando implementé en java no ...
  #1 (permalink)  
Antiguo 20/02/2009, 19:36
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 5 meses
Puntos: 18
Problema con Interface

Hola, revisando viejos mis viejos archivos deJAVA(que seguí de manera autodidacta) encontré un diagrama de clases(que por cierto es básico), cuando implementé en java no tuve ningún problema, así que ahora tengo la curiosidad de implementarlo en php5 , la descripción es la siguiente:
• La interfaz Parlanchin tiene el operador habla();
• La clase abstracta Animal implementa la operación habla() de la interfaz.
• La clase perro y gato heredan de la clase animal, implementando cada uno la operación habla() a su manera.
• La clase Reloj es abstracta.
• la clase Cucu implementa la interfaz Parlanchin y hereda de la clase Reloj.
(disculpen pero no me es posible adjuntar el diagrama)

La generación de códigos para php5 por ArgoUML es la siguiente (he recortado algunos códigos y documentación generados, que no tienen tanta relevancia para este post).
interface.Parlanchin.php
<?php
interface Parlanchin
{
public function habla();
}
?>
class.Animal.php
<?php
require_once('interface.Parlanchin.php');
abstract class Animal implements Parlanchin
{
public function habla()
{ }
}
?>
class.Gato.php
<?php
require_once('class.Animal.php');
class Gato extends Animal
{
public function habla()
{
return "Miau";
}
}
?>
class.Perro.php
<?php
require_once('class.Animal.php');
class Perro extends Animal
{
public function habla()
{
return "Guau";
}
}
?>
class.Reloj.php
<?php
abstract class Reloj
{
}
?>
class.Cucu.php
<?php
require_once('class.Reloj.php');
require_once('interface.Parlanchin.php');
class Cucu extends Reloj implements Parlanchin
{
public function habla()
{
return "Cucú cucú …";
}
}
?>
Y la clase aplicativo es esta.
class.Aplicativo.php
<?php
require_once('interface.Parlanchin.php');
require_once('class.Gato.php');
require_once('class.Cucu.php');
class Aplicativo
{
public static function hazleHablar( Parlanchin $sujeto)
{
$sujeto.habla();
}
public static function main()
{
self::hazleHablar(new Gato());
self::hazleHablar(new Cucu());
}
}
$instanciar= Aplicativo::main();
echo $instanciar;
?>
El detalle es en ésta última ya que me dice que la función habla no está definido( esto es en la función hazleHablar() de la última clase).
Fatal error: Call to undefined function habla()

La otra consulta es ¿es necesario que mi última clase(class.Aplicativo.php) esté en el diagrama de clases? Si fuera así ¿Qué tipo de relación habría con las otras clases?, ya que en Java no era necesario.
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #2 (permalink)  
Antiguo 21/02/2009, 08:29
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Problema con Interface

Estimado, tienes que ayudarnos un poquito más, por ejemplo:

  1. Sube el diagrama a un lugar como http://www.4shared.com/ (formato imagen, así nadie depende de tu programa de diseño) y luego comunicas el link
  2. Indentar y colorear el código, usa el botón "php" de tu editor avanzado, así queda mucho más entendible.

Ni bien lo tengas listo, paso a darte una mano con el resto.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #3 (permalink)  
Antiguo 21/02/2009, 15:27
 
Fecha de Ingreso: octubre-2005
Mensajes: 42
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: Problema con Interface

Tienes un par de errores en tu código.

El primero es un error de sintáxis. En el método hazleHablar de Aplicativo la llamada que haces a hablar usas la sintaxis de Java. Debería ser:
Código PHP:
$sujeto->habla(); 

El segundo error es que los métodos main y hazleHablar de Aplicativo no devuelven ningun valor, por lo que al imprimir por pantalla el valor de $instanciar nunca obtendrás nada.

Una vez que corrijas eso, el código funciona perfectamente.
  #4 (permalink)  
Antiguo 21/02/2009, 18:39
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 5 meses
Puntos: 18
Respuesta: Problema con Interface

ok lo subiré mañana(disculpen es que la verdad no estoy conectado constantemente a la internet), el diagrama.

CAT no veo el error de sintaxis que me comentas ya que el código al que te refieres está así. lo segundo me dices sobre lo del retorno en eso tienes razón y muchas gracias por el dato.

de seguro si subo mi diagrama me ayudarán hasta luego.
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #5 (permalink)  
Antiguo 21/02/2009, 19:11
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Problema con Interface

Muy buenas las observaciones CAT, pero si no nos ayudamos para "educar" a los usuarios que mejoren un poco la forma de hacer preguntas, llegará el momento que habrán preguntas sin contestar, ya que no tenemos el tiempo suficiente como para interpretar lo que se quiere preguntar.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #6 (permalink)  
Antiguo 22/02/2009, 18:32
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 5 meses
Puntos: 18
Respuesta: Problema con Interface

aqui está la imágen del diagramaen argouml

interface.Parlanchin.php
Cita:
<?php
interface Parlanchin
{
public function habla();
}
?>
class.Animal.php
Cita:
<?php
require_once('interface.Parlanchin.php');
abstract class Animal implements Parlanchin
{
public function habla()
{ }
}
?>
class.Gato.php
Cita:
<?php
require_once('class.Animal.php');
class Gato extends Animal
{
public function habla()
{
return "Miau";
}
}
?>
class.Perro.php
Cita:
<?php
require_once('class.Animal.php');
class Perro extends Animal
{
public function habla()
{
return "Guau";
}
}
?>
class.Reloj.php
Cita:
<?php
abstract class Reloj
{
}
?>
class.Cucu.php
Cita:
<?php
require_once('class.Reloj.php');
require_once('interface.Parlanchin.php');
class Cucu extends Reloj implements Parlanchin
{
public function habla()
{
return "Cucú cucú …";
}
}
?>
Y la clase aplicativo es esta.
class.Aplicativo.php
Cita:
<?php
require_once('interface.Parlanchin.php');
require_once('class.Gato.php');
require_once('class.Cucu.php');
class Aplicativo
{
public static function hazleHablar( Parlanchin $sujeto)
{
$sujeto.habla();
}
public static function main()
{
self::hazleHablar(new Gato());
self::hazleHablar(new Cucu());
}
}
$instanciar= Aplicativo::main();
echo $instanciar;
?>
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #7 (permalink)  
Antiguo 22/02/2009, 21: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: Problema con Interface

Tienes el mismo problema que te habian comentado, estas usando sintaxis de Java cuando debes de usar de PHP.

Por otro lado tu función main no regresa nada por lo que no debes de hacer un "echo" de ella.

Saludos
  #8 (permalink)  
Antiguo 22/02/2009, 22:10
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Problema con Interface

Estimado, erraste el tag para el código fuente, estás usando "quote" y no "php"

Ya te comentarion tus errores, pero te muestro el ejemplo en el cambio de tag al citar:

Código PHP:
<?php
require_once('interface.Parlanchin.php');
require_once(
'class.Gato.php');
require_once(
'class.Cucu.php');

class 
Aplicativo
{
    public static function 
hazleHablar(Parlanchin $sujeto)
    {
       
$sujeto->habla();
    }
    public static function 
main()
    {
       
self::hazleHablar(new Gato());
       
self::hazleHablar(new Cucu());
    }


echo 
Aplicativo::main();
Comentarios sobre el UML

Cita:
"La otra consulta es ¿es necesario que mi última clase(class.Aplicativo.php) esté en el diagrama de clases? Si fuera así ¿Qué tipo de relación habría con las otras clases?, ya que en Java no era necesario."
  1. No tiene mucho sentido una interfaz Parlanchin que deba implementar Animal, tal vez si pase para el caso de un Loro
  2. La clase Aplicativo la agregas si la necesitas para tu documentación, en lo personal considero que es muy importante que exista para lograr transmitir cómo se usan e invocan todas las clases que resuelven el "problema".
  3. El tipo de relación dependerá de tu diseño, pero si es una clase que lo único que hace es ejecutar la "solución", muy probablemente sea de "dependencia".
  4. Tu diagrama está mal, si desde Aplicativo necesitas hacer new a Gato y a Cucu, salen flechas de dependencia a esas dos clases.
  5. Lo de "Java no era necesario", no tiene sentido, UML es independiente del lenguaje, lo que estás comentando tal vez se base en tu experiencia al haber aprendido UML + Java, y nada tiene que ver si tu docente no lo agregaba en el diagrama.
  6. Nota aparte, eliminaría todos los "habla" del diagrama y lo dejaría en la interfaz, ya que se sobre entiende que estarán estos métodos en las clases inferiores.
  7. Cambia tu codificación y usa el estándar de Zend.
Dime si te quedan dudas.

PD: ves que el código coloreado y bien indentado se entiende mejor?

Si tu exposición es más clara y le dedicas un poco de tiempo, las respuestas serán mejores y más rápidas, ya que nos lleva menos tiempo entenderlas.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #9 (permalink)  
Antiguo 23/02/2009, 18:02
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 5 meses
Puntos: 18
Respuesta: Problema con Interface

Enrique gracias por tus explicaciones, sólo que como decía era un ejemplo nomás, porque de hecho en aplicaciones reales la interfaz tendría más operaciones (claro también con sentido), esa interfaz lo tengo porque la clase animal y la clase reloj son de diferente jerarquía, que hacen la misma operación pero de diferentes formas.

la clase animal es abstracta porque como digo en aplicaciones reales sería más complejo lo mismo que la clase Cucu, de la que heredarían más clases.

sobre la clase aplicativo (en la relación) si me dí cuenta, hay un error(horror) muy grande al relacionarlo con la interfaz.

Gatorv sobre los echos si lo tengo en cuenta, sólo que una de mis preguntas era porque me dice en la clase aplicativo que la función habla no está definido a que se debe.
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
  #10 (permalink)  
Antiguo 23/02/2009, 22:31
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: Problema con Interface

Eso te lo dice porque la sintaxis esta mal, el parser al ver esto: $sujeto.habla(); trata de hacer esto, evalua lo que haya en $sujeto, pero como no hace nada pues no hace nada, luego en PHP el operador de "." es para concatenar asi que le trata de concatenar el resultado de la función habla() pero como esta no esta definida por eso te da el error.

En PHP la forma correcta de llamar a una función es: $objeto->metodo();

Saludos
  #11 (permalink)  
Antiguo 25/02/2009, 19:52
Avatar de argy  
Fecha de Ingreso: octubre-2007
Ubicación: Longitud 75º Latitud 18º Sur
Mensajes: 614
Antigüedad: 16 años, 5 meses
Puntos: 18
Respuesta: Problema con Interface

gracias GatorV se me pasó, debería ser

Cita:
$sujeto->habla
otra vez las gracias a todos.
__________________
Software libre para un mundo libre.

Eventualmente en el foro.
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 22:38.