Foros del Web » Programando para Internet » PHP »

Problema con clases

Estas en el tema de Problema con clases en el foro de PHP en Foros del Web. Hola, estoy haciendo una aplicación y en un formulario de registro tengo que llenar varios select, como por ejemplo: categorías, marcas, etc. Tengo varias clases, ...
  #1 (permalink)  
Antiguo 29/10/2013, 07:41
 
Fecha de Ingreso: mayo-2003
Ubicación: Lima
Mensajes: 946
Antigüedad: 16 años, 8 meses
Puntos: 8
Problema con clases

Hola, estoy haciendo una aplicación y en un formulario de registro tengo que llenar varios select, como por ejemplo: categorías, marcas, etc.

Tengo varias clases, una para categorías, marcas, etc.

Uso el patrón Singleton, pero al llamar a más de una clase, me sale este mensaje:

Fatal error: Cannot redeclare class Database in F:\xampp\htdocs\ruben\compra2\inc\class\dbConnect. php on line 2

Les pongo la clase de conexión y 2 de las otras para ver como es que puedo evitar este error:

Clase dbConnect:
Código PHP:
class Database {
    static private 
$instance;
    private 
$conn;
    
    private function 
__construct() {
        try{
            
$this->conn = new PDO('mysql:host=localhost;dbname=compras''root''kadmi2013');
            
$this->conn->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
            
$this->conn->exec("SET CHARACTER SET utf8");
        }catch(
PDOException $e){
            echo 
"ERROR: " $e->getMessage();
        }
    }
    
    public static function 
singletonConection() {
        if (!isset(
self::$instance)) {
            
$miclase __CLASS__;
            
self::$instance = new $miclase;
        }
 
        return 
self::$instance;
    }

    public function 
prepare($sql) {
        return 
$this->conn->prepare($sql);
    }
    
    public function 
__clone() {
        
trigger_error('La clonación de este objeto no está permitida.'E_USER_ERROR);
    }

Clase tipoDocumentos:
Código PHP:
require("dbConnect.php");

class 
tipoDocumentos {
    static private 
$instance;
    private 
$conn;
    private 
$error 0;
    private 
$result;
    const 
TABLA "tipo_documento";
    
    
//Constructor
    
private function __construct() {
        
$this->conn Database::singletonConection();
    }
    
    public static function 
singletonTipoDocumento() {
        if (!isset(
self::$instance)) {
            
$miclase __CLASS__;
            
self::$instance = new $miclase;
        }
 
        return 
self::$instance;
    }
   
    
//Listar select tipo de documento
    
public function listaTipoDocumento($tipoDocumento null) {
        
        try {
            
$sql "SELECT * FROM " self::TABLA " ORDER BY nombre";
            
$query $this->conn->prepare($sql);
            
            if (!
$query->execute()) {
                
$this->error 1;
            }
            else {
                
$nr $query->rowCount();
                if (
$nr 0) {
                    while (
$row $query->fetch(PDO::FETCH_NUM)) {
                        if (
$row[0] == $tipoDocumento) {
                            
$this->result .= "<option value='" $row[0] . "' selected>" $row[1] . "</option>";
                        }
                        else {
                            
$this->result .= "<option value='" $row[0] . "'>" $row[1] . "</option>";
                        }
                    }
                }
                else {
                    
$this->result "<option value=''>No hay tipos de documentos</option>";
                }
                
                
$this->conn null;
                return 
$this->result;
            }
        } catch (
PDOExeption $e) {
            return 
"Error: " $e->getMessage();
        }
        
        return 
$this->error;
    }
    
    public function 
__clone() {
        
trigger_error('La clonaci&oacute;n no est&aacute; permitida para este objeto.'E_USER_ERROR);
    }

Clase Provincias:
Código PHP:
require("dbConnect.php");

class 
Provincia {
    static private 
$instance;
    private 
$conn;
    private 
$error 0;
    private 
$result;
    const 
TABLA "provincias";
    
    
//Constructor
    
private function __construct() {
        
$this->conn Database::singletonConection();
    }
    
    public static function 
singletonProvincias() {
        if (!isset(
self::$instance)) {
            
$miclase __CLASS__;
            
self::$instance = new $miclase;
        }
 
        return 
self::$instance;
    }
   
    
//Listar select provincias
    
public function listaProvincias($provincia null) {
        try {
            
$sql "SELECT * FROM " self::TABLA " ORDER BY nombre";
            
$query $this->conn->prepare($sql);
        
            if (!
$query->execute()) {
                
$this->error 1;
            }
            else {
                
$nr $query->rowCount();
                if (
$nr 0) {
                    while (
$row $query->fetch(PDO::FETCH_NUM)) {
                        if (
$row[0] == $provincia) {
                            
$this->result .= "<option value='" $row[0] . "' selected>" $row[1] . "</option>";
                        }
                        else {
                            
$this->result .= "<option value='" $row[0] . "'>" $row[1] . "</option>";
                        }
                    }
                }
                else {
                    
$this->result "<option value=''>No hay provincias</option>";
                }
                
                
$this->conn null;
                return 
$this->result;
            }
        } catch (
PDOExeption $e) {
            return 
$e->getMessage();
        }
        
        return 
$this->error;
    }
    
    public function 
__clone() {
        
trigger_error("La clonaci&oacute;n no est&aacute; permitida para este objeto."E_USER_ERROR);
    }

Espero su ayuda. Gracias.
__________________
El aprendiz.
  #2 (permalink)  
Antiguo 29/10/2013, 07:52
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 926
Antigüedad: 12 años, 9 meses
Puntos: 269
Respuesta: Problema con clases

No es que "llames a más de una clase", sino que incluyes ("require") el mismo fichero más de 1 vez.Por lo que intentas definir la misma clase 2 veces.Cambia require por require_once.
  #3 (permalink)  
Antiguo 30/10/2013, 06:28
 
Fecha de Ingreso: mayo-2003
Ubicación: Lima
Mensajes: 946
Antigüedad: 16 años, 8 meses
Puntos: 8
Respuesta: Problema con clases

Hice lo que me dijiste y sigue el mismo error. De esta forma es como llamo a las clases:
Código PHP:
session_start();
require_once(
'inc/class/tipoDocumentos.php');
require_once(
'inc/class/provincias.php');
$tdoc tipoDocumentos::singletonTipoDocumento();
$prov Provincia::singletonProvincias(); 
__________________
El aprendiz.
  #4 (permalink)  
Antiguo 30/10/2013, 06:39
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 926
Antigüedad: 12 años, 9 meses
Puntos: 269
Respuesta: Problema con clases

Fatal error: Cannot redeclare class Database in F:\xampp\htdocs\ruben\compra2\inc\class\dbConnect. php on line 2

La clase que está siendo redefinida es Database.
Estás haciendo require_once cuando cargas dbConnect.php?
En el código que pegas, estás usando require_once para otras clases.
  #5 (permalink)  
Antiguo 30/10/2013, 06:52
 
Fecha de Ingreso: mayo-2003
Ubicación: Lima
Mensajes: 946
Antigüedad: 16 años, 8 meses
Puntos: 8
Respuesta: Problema con clases

Ok, ahora si, muchas gracias dashtrash por tu tiempo y por tu ayuda.

Saludos,
__________________
El aprendiz.

Etiquetas: clases, formulario, registro, select, sql, tabla
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 10:54.