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

Abstracción de clase

Estas en el tema de Abstracción de clase en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas tardes, mi problema es el siguiente, estoy intentando crear una clase sobre una ya existente, por la cuestión de modularidad, es decir, si en ...
  #1 (permalink)  
Antiguo 20/03/2009, 15:10
 
Fecha de Ingreso: marzo-2009
Mensajes: 3
Antigüedad: 15 años, 1 mes
Puntos: 0
Abstracción de clase

Buenas tardes, mi problema es el siguiente, estoy intentando crear una clase sobre una ya existente, por la cuestión de modularidad, es decir, si en X o Y momento quiero migrar a otra clase para subir archivos, solo modificaria mi clase existente sin necesidad de ir a cada módulo donde cargue archivos y modificarlos, al igual como se hace con las abstracciones de base de datos.

Estoy usando PEAR::HTTP_Upload para cargar los archivos.

Mi clase:

Código PHP:
<?php

class Subir
{   
    function 
__construct()
    {
        
// Instanciamos la claseHTTP_Upload
        
$this->subir = new HTTP_Upload('es'); 
    }
    
    private 
$archivo;
    
    function 
cargaArchivo($archivo)
    {
        
// Cargamos el archivo a subir
        
$this->file $this->subir->getFiles($archivo);
        
print_r($this->file);
        
    }
    
    private 
$propiedad;
    
    function 
getProp($propiedad)
    {
        
// Cargamos para mostrar la propiedad que queremos
        
$this->file->getProp($propiedad);
    }
    
    private 
$carpeta;
    
    function 
moverA($carpeta)
    {
        
// Movemos archivo a la carpeta indicada
        
$this->movido $this->file->moveTo($carpeta);
    }
    
    function 
getMensaje()
    {
        
// Obtenemos mensaje
        
$this->movido->getMessage();
    }
    
    function 
esValido()
    {
        
// Verificamos si el archivo es válido
        
$this->file->isValid();
    }
    
    
    function 
sinArchivo()
    {
        
// Verificamos si no se subió un archivo
        
$this->file->isMissing();
    }
    
    function 
hayError()
    {
        
// Verificamos si hubo algún error
        
$this->file->isError();
    }
    
    function 
msjError()
    {
        
// Mostramos el mensaje de errror
        
$this->file->errorMsg();    
    }
    
    private 
$var;
    
    function 
errorPEAR($var)
    {
        
// Verificamos si hubo algun error con PEAR::IsError
        
PEAR::isError($var);
    }
}
?>
Aquí en donde uso mi clase:

Código PHP:
<?
//previamente el la clase cargada con autoload
$upload         = new Subir();
 
/// Cargamos archivo proveniente del formulario
    
$upload->cargaArchivo('xml');
    
// Verificamos si el archivo es valido
    
if ($upload->file->esValido())
    {
        
// Movemos el archivo a la carpeta asignada
        
$movido $upload->MoverA(DIR_UPLOAD);
        
// Verificamos si hubo un error
        
if (errorPEAR($movido))
        {
            echo 
'Correctamente subido a: ' .$upload->getProp('ext');
        }
        else
        {
            
// Mostramos mensaje de error
            
$upload->getMensaje();    
        }
    }
    
// Verificamos si se subió un archivo
    
elseif ($upload->sinArchivo())
    {
        echo 
'Debes subir un archivo';
    }
    
// Verificamos si se pudo mover el archivo
    
elseif ($upload->moverA)
    {
        
// Mostramos mensaje de error
        
echo $upload->msjError();
    }
Le he hecho var_dump para ver donde está el problema y no lo encuentro para nada, la clase está instanciada, pero ni idea de porque no funciona.

Lo probé a 'patica' sin usar la clase que yo he hecho, usando directamente la clase PEAR::HTTP_Upload y funciona -perfectamente-.

Código PHP:
<?php
require_once "HTTP/Upload.php";

$upload = new HTTP_Upload("en");
$file $upload->getFiles("f");

if (
$file->isValid()) {
    
$moved $file->moveTo('uploads/');
    if (!
PEAR::isError($moved)) {
        echo 
'File was moved to uploads/' $file->getProp('name');
    } else {
        echo 
$moved->getMessage();
    }
} elseif (
$file->isMissing()) {
    echo 
"No file was provided.";
} elseif (
$file->isError()) {
    echo 
$file->errorMsg();
}
?>

Saludos

Última edición por andresenrique; 20/03/2009 a las 15:21
  #2 (permalink)  
Antiguo 20/03/2009, 21:32
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 4 meses
Puntos: 2
Respuesta: Abstracción de clase

Pregunta para los expertos ^^

¿ En este caso que propone "andresenrique" no sería apropiado un "Template pattern" o bién un "Adapter/wrapper pattern" ?

En la wikipedia hay ejemplos, puedes mirar a ver si esos patrones de diseño te sirven.

Pero alguién podría confirmarlo pliiiiiiisss ???

Gracias ;)
  #3 (permalink)  
Antiguo 21/03/2009, 13:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Abstracción de clase

El problema que veo es, primero en tu clase solamente llamas a algunas cosas, y nunca regresas con "return" el valor que regresa el método.

Posteriormente en donde implementas llamas a métodos sin usar la instancia de la clase, y luego llamas a otros métodos pero sin los parentesis, lo que es como si estuvieras leyendo una propiedad de la clase en lugar de un método.

SAludos.
  #4 (permalink)  
Antiguo 22/03/2009, 05:28
Avatar de jaskel  
Fecha de Ingreso: febrero-2009
Ubicación: Alcorcon
Mensajes: 11
Antigüedad: 15 años, 3 meses
Puntos: 0
Respuesta: Abstracción de clase

Mi primer consejo es que te leas un buen manual de POO, el segundo es que procures ser ordenado y limpio con el código.

Declara los atributos de la clase al principio de la misma definiendo siempre si son publicos, privado o protegidos, haz lo mismo con los metodos y define los getters y setters de la clase si es necesario, sigue una nomenclatura estandar para definir atriubutos, metodos y clases. por ejemplo defines el metodo moverA y luego lo invocas llamando a MoverA.

Basicamente entiende lo que haces y luego aplicalo de forma clara y ordenada, una vez que que lo hayas hecho de esa manera y te siga sin funcionar vuelve a preguntar :)
  #5 (permalink)  
Antiguo 23/03/2009, 11:34
isra00
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Abstracción de clase

Creo que el patrón que vendría bien sería, no Template sino Strategy: construir un "uploader" abstracto (clase abstracta o interfaz) y seguir una u otra "estrategia" (PEAR, el de PHP por defecto, otro futuro...). Más info en http://www.ibm.com/developerworks/li...p-designptrns/. Siento no poder ayudarte con el tema del uploader, pero estoy bastante verde en esa librería.
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 15:56.