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

¿Redeclarar un clase?

Estas en el tema de ¿Redeclarar un clase? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola :D!!! Descripción base de lo que estoy haciendo - Estoy diseñando un prototipo de CMS en donde la mayoria de la configuración se tome ...
  #1 (permalink)  
Antiguo 11/01/2009, 12:07
 
Fecha de Ingreso: diciembre-2008
Ubicación: Bogotá
Mensajes: 19
Antigüedad: 15 años, 10 meses
Puntos: 0
¿Redeclarar un clase?

Hola :D!!!

Descripción base de lo que estoy haciendo

- Estoy diseñando un prototipo de CMS en donde la mayoria de la configuración se tome de una BD. y pues tengo una serie de archivos dónde se encuentra en detalle cada cosa.

Problema
- Tengo una clase dónde se cargan las secciones de la página, hasta el momento todo ha funcado bien, ahora que necesito meterle el menu izquierdo (El cual sacará las opciones de la BD con su respectiva URL) se me presenta el problema de que tengo que hacer uso de la clase "conex", la cual conecta y obtiene los querys para la consulta, pero cuándo hago esto me sale el siguiente error.

Fatal error: Cannot redeclare class conex in D:\AppServ\www\ricclub2\class\conex.php on line 11.

He intentado hacer varias cosas, pero las unicas soluciones que se me ocurren solo harián mi código muy extenso.

No siendo más agradezco sus comentarios o ideas ;).

Greetings to all and happy BandWidth.

Editado 5 minutos más tarde

Bueno, mirando otros POST y consultando la documentación de PHP encontre que al momento de hacer la inclusión de tus archivos dentro de una clase, usando include_once solucionas este inconveniente.

Última edición por dmks; 11/01/2009 a las 12:11 Razón: SOLUCION
  #2 (permalink)  
Antiguo 11/01/2009, 12:10
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: ¿Redeclarar un clase?

mmm....

mira, si ya existe la clase... es por eso el error, no puedes declararla de nuevo!!!

ahora... si ya existe ¿porque no la reutilizas???

Código PHP:
$foo = new conex
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 11/01/2009, 12:18
 
Fecha de Ingreso: diciembre-2008
Ubicación: Bogotá
Mensajes: 19
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: ¿Redeclarar un clase?

Lo que pasaba era que tenia una clase

Código:
/**** package.php ****/ 
class package{
   var $option1;
   
   function package(){
        $this->option1;
   }

   function showLeftMenu(){
       include('conex.php'); //Clase conex.php
       $conex = new conex(); //Aqui mostraba el error.
   }
}

/**** conex.php ***/
class conex{
    var $otherOptionxD; 

  
   function connect_db(){
         .....
         ....
   }
}

# Solucion en Package


   function showLeftMenu(){
       include_once('conex.php'); //Aqui esta la solucion
       $conex = new conex(); 
   }
  #4 (permalink)  
Antiguo 11/01/2009, 12:23
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años, 7 meses
Puntos: 2534
Respuesta: ¿Redeclarar un clase?

mmm... mas que inconveniente, error.... mas que solución, desviación...

digo, si tan solo necesitas la clase conex a través de varios script... cárgalo al inicio del index (o algo así) !!!

demás, si ya existe la clase conex en el mismo script ¿para que la incluyes??


según yo, tan solo deberías carga una ves... al inicio del script tu clase conex en lugar de "usar soluciones temporales"
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 11/01/2009, 12:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: ¿Redeclarar un clase?

Tema trasladado a PHP Orientado a Objetos.
  #6 (permalink)  
Antiguo 11/01/2009, 16:41
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 5 meses
Puntos: 32
Respuesta: ¿Redeclarar un clase?

Cita:
Iniciado por pateketrueke Ver Mensaje
mmm....

mira, si ya existe la clase... es por eso el error, no puedes declararla de nuevo!!!

ahora... si ya existe ¿porque no la reutilizas???

Código PHP:
$foo = new conex
Es completamente válido "requerir" (no redeclarar) una clase que necesites. Si tienes varias clases y todas ellas en su diseño interno requieren de otra clase, como ser la de conexión a la base de datos, es correcto que cada una que la necesite la incluya y nunca centralizar esto en un solo archivo, como ser, index.php.

Es importante que cada clase sea independiente del contexto que define index.php
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #7 (permalink)  
Antiguo 13/01/2009, 22:52
 
Fecha de Ingreso: septiembre-2004
Mensajes: 252
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: ¿Redeclarar un clase?

Código PHP:

if(!defined("MICLASE"))
{
   
define("MICLASE"1);
   

   class 
miClase
   
{
          public function 
__construct()
          {
          }
   }

  #8 (permalink)  
Antiguo 14/01/2009, 05:05
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 5 meses
Puntos: 32
Respuesta: ¿Redeclarar un clase?

Cita:
Iniciado por GermanBsAs Ver Mensaje
Código PHP:

if(!defined("MICLASE"))
{
   
define("MICLASE"1);
   

   class 
miClase
   
{
          public function 
__construct()
          {
          }
   }

Ojo, una cosa es "requerir una clase" y otra "redefinir una clase", pero si lo que realmente necesita es tener una clase "A" con distintos códigos, la verdad, sí me parece desprolijo.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #9 (permalink)  
Antiguo 15/01/2009, 15:40
 
Fecha de Ingreso: septiembre-2004
Mensajes: 252
Antigüedad: 20 años, 1 mes
Puntos: 0
Respuesta: ¿Redeclarar un clase?

Cita:
Iniciado por enriqueplace Ver Mensaje
Ojo, una cosa es "requerir una clase" y otra "redefinir una clase", pero si lo que realmente necesita es tener una clase "A" con distintos códigos, la verdad, sí me parece desprolijo.
Jamas puse nada de requerir clases que yo sepa se requieren ficheros ( si el fichero contiene o no una clase, no me interesa). Y El thread no habla de necesitar redefinir clases

digamos que
clase A
esta definida en el fichero
CA.class.php


y que clase B siendo una derivada de a requiere el fichero en donde esta declarada la clase A

Código PHP:
/**
 *  Filename: CB.class.php
 */
require 'CA.class.php';
Class 
extends A{} 
Y por alguna otra razon hay una segunda clase derivada de A llamada clase C


Código PHP:
/**
 *  Filename: CC.class.php
 */
require 'CA.class.php';
Class 
extends A{} 
para invocar un objeto de la clase B un script cliente de esa clase debe invocar al fichero CB.class.php


Código PHP:
require 'CB.class.php';
$actorB= new B
Donde se invoca al fichero 'CB.class.php'; y este mismo invoca al fichero 'CA.class.php';
Todavia vamos bien , asi que no hay problema hasta ahora


Ahora digamos que hay otro script que requiere un objeto de la clase B y C al mismo tiempo

Código PHP:
require 'CB.class.php';
require 
'CC.class.php';
$actorB= new B;
$actorC= new C
Donde 'CB.class.php'; y este mismo invoca al fichero 'CA.class.php'; y 'CC.class.php'; y este mismo invoca al fichero 'CA.class.php';
o osea que en algun momento de ejecucion de ese script va a dar un error dde redefinicion de clases.

Encapsulando la clase definiendo una constante si ya fue instanciada una vez evita ese error.
Código PHP:
if(!defined("MICLASE"))
{
   
define("MICLASE"1);
   

   class 
miClase
   
{
          public function 
__construct()
          {
          }
   }

Es tambien una metodologia muy comun en C++
Código:
#ifndef A_H_
#define A_H_

class A {
public:
	A();
	virtual ~A();
};

#endif /* A_H_ */

Última edición por GermanBsAs; 15/01/2009 a las 16:03
  #10 (permalink)  
Antiguo 15/01/2009, 15:57
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: ¿Redeclarar un clase?

O mejor usar require_once y te evitas ese problema

Saludos.
  #11 (permalink)  
Antiguo 15/01/2009, 17:14
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 5 meses
Puntos: 32
Respuesta: ¿Redeclarar un clase?

Germán, deberás disculparme, pero esto está mal resuelto.

Como reglas generales para POO bajo PHP

  1. Una clase debe estar en un solo fichero/archivo, y el nombre del fichero/archivo debe ser el mismo que el nombre de la clase.
  2. Cada clase debe manejar su dependencia con las clases de forma independiente de las clases con las cuales interactúa (nada de centralizar en un fichero todas las dependencias de otra clase, etc).
  3. En la relación entre las clases debes usar require_once, lo que resuelve si dos clases que se relacionan entre sí dependen a su vez de la misma clase, por consiguiente solo se invoca una vez.
  4. En un mismo contexto, nunca redefinir la misma clase, ya que pierde consistencia el sistema (por ej, en un sistema contable tener una clase Cliente que según la clase que la llame puedan "reescribir" la clase para que su diseño sea distinto a la clase original).
  5. Anexo: debemos usar todos el mismo estándar de codificación (Zend)

Por lo tanto el ejemplo debería ser:

Código PHP:
require_once 'B.php';
require_once 
'C.php';

$actorB= new B();
$actorC= new C(); 
Cita:
Encapsulando la clase definiendo una constante si ya fue instanciada una vez evita ese error.
Poco importa que este tipo de prácticas las hagan en C, C++ o Pascal, de todas formas conceptualmente son muy desprolijas, en el lenguaje que se haga.

¿Se entiende por qué?
__________________
Blog phpsenior.com Cursos a Distancia surforce.com

Última edición por enriqueplace; 16/01/2009 a las 06:54 Razón: mal redactado
  #12 (permalink)  
Antiguo 28/01/2009, 19:36
 
Fecha de Ingreso: diciembre-2008
Ubicación: Bogotá
Mensajes: 19
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: ¿Redeclarar un clase?

Bueno, pero muchachos lo que pasa es lo siguiente.

1. Talvez no conozco mucho de POO porque hasta ahora estoy comenzando a cambiar todos mis codigos a PHP OO., por lo tanto aun tengo muchas dudas.

2. EL problema que tengo es que en cada método que uso debo incluir nuevamente el fichero que contiene la clase de conexión a la BD ya que no se donde mas pueda definirla. a menos que este por fuera de todos los metodos y cada vez que valla a realizar alguna operación o invocar un metodo acceda a esa variable definida anteriormente.

3. No siendo más agradezco todos sus comentarios ya que aclararón muchas dudas.

4. Me gustaria saber entonces que solución es más limpia al momento de realizar lo que estoy haciendo. En cada método que necesite acceder a la BD llame al fichero de la clase y la instancie para invocar los métodos correspondientes.


Gracias
  #13 (permalink)  
Antiguo 28/01/2009, 22:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: ¿Redeclarar un clase?

Hola dmks,

La forma más limpia es usar require_once para solamente incluir la clase una vez, esto en conjunto con __autoload en dado caso o SPL te puede beneficiar al cargar tus clases.

Saludos
  #14 (permalink)  
Antiguo 28/01/2009, 22:37
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años, 5 meses
Puntos: 32
Respuesta: ¿Redeclarar un clase?

No tiene nada de malo que la clase "x" requiera de la clase "DB" porque necesita una conexión a la base de datos, tampoco que haga un new en cada método que así lo necesites.

Debes ver qué relación de diseño se aplica según las relaciones de clases, no lo hagas de forma mecánica: herencia, asociación, dependencia, etc.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
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 11:28.