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

Dudas con interfaces

Estas en el tema de Dudas con interfaces en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, soy autodidacta en programación y ahora tengo un par de semanas con POO y PHP5, entiendo las diferencias entre una clase abstracta y una ...
  #1 (permalink)  
Antiguo 10/03/2012, 12:18
 
Fecha de Ingreso: marzo-2012
Mensajes: 9
Antigüedad: 12 años, 1 mes
Puntos: 0
Dudas con interfaces

Hola, soy autodidacta en programación y ahora tengo un par de semanas con POO y PHP5, entiendo las diferencias entre una clase abstracta y una interfaz, haciendo algunos pininos me he topado con lo siguiente:

Esta bien echo el sieguiente ejemplo?:

index.php
Código PHP:
<?php

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

class 
index
{
    public function 
run()
    {
        
$conx = new conectordb();
        
$conx->insert();
        
$q = new managerdb();
        
        
$q->testQuery($conx);
    }
}

$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;
    
    public function 
conect()
    {
        
$this->_conexion mysql_connect(self::SERVIDOR,self::USUARIO,self::PASS);
        
mysql_select_db(self::DB,$this->_conexion);
    }
    public function 
insert()
    {
        return 
"SELECT * FROM animales";
    }
    public function 
close()
    {
        
mysql_close($this->_conexion);
    }
}
interfacedb.php

Código PHP:
<?php

interface interfacedb
{
    public function 
insert();
    public function 
conect();
    public function 
close();
}

managerdb.php
Código PHP:
<?php

class managerdb
{
    public function 
testQuery(interfacedb $manager)
    {
        echo 
$manager->insert();
    }
}

El script funciona... pero....

En managerdb.php no hago un require_once de la interface y en el metodo testQuery solo recibo "cualquier cosa" y funciona siempre y cuando tenga el metodo insert()... ahi entiendo que debo usar el type hinting y haciendolo tambien funciona sin problemas mi duda es si lo que estoy haciendo está bien implementado el ejemplo que les expongo (usando type hinting)...

La otro duda es: Supongamos que voy a escribir una clase que se conectará a una base de datos MySQL, ahi mismo tengo su constructor y 3 metodos (insert, delete,update y select) y ademas la heredo a otra clase por el siemple echo de usar el select y mostrar los resultados... eso estaria mal verdad?... tendria que usar una interfaz cierto?.... yo lo veo asi:

"La herencia es para "heredar" propiedades y la interfaz para hacer uso de metodos que hacen diferentes cosas"

estoy bien?... voy por buen camino ???

Gracias...

P.D si alguien tiene algunos ejemplos sobre interfaces y me los quiera proporcionar muchas gracias...
  #2 (permalink)  
Antiguo 10/03/2012, 18:09
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Dudas con interfaces

Claro, la idea es que uses el type hinting con la clase base para que tu clase funcione de la manera que esta diseñada.

No, la herencia es cuando hay una relación de parentezco entre las dos clases, no solo se hereda por heredar (Lee sobre el principio de Liskov).

Ahora sí tu segunda clase solo va a usar un select para algo, no es correcto que ocupes la herencia, si no más bien tu segunda clase necesita de esa dependencia:

Código PHP:
Ver original
  1. class MyClass {
  2.        private $db;
  3.  
  4.        public function setDb(Db $db)
  5.        {
  6.                $this->db = $db;
  7.  
  8.                return $this;
  9.        }
  10.  
  11.        public function getDb()
  12.        {
  13.               return $this->db;
  14.        }
  15.  
  16.        public function makeFoo()
  17.        {
  18.               $result = $this->getDb()->select('foo');
  19.        }
  20. }

Ya que como tal no hay una relación de herencia, si no más bien de uso, lee sobre Dependency Injection para que entiendas como debes de relacionar tus clases.

Saludos.

Etiquetas: clase, class, dudas, interfaces, 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 03:32.