Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Frameworks y PHP orientado a objetos (http://www.forosdelweb.com/f68/)
-   -   ¿Redeclarar un clase? (http://www.forosdelweb.com/f68/redeclarar-clase-661210/)

dmks 11/01/2009 12:07

¿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.

pateketrueke 11/01/2009 12:10

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

:pensando:

dmks 11/01/2009 12:18

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();
  }


pateketrueke 11/01/2009 12:23

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"

GatorV 11/01/2009 12:55

Respuesta: ¿Redeclarar un clase?
 
Tema trasladado a PHP Orientado a Objetos.

enriqueplace 11/01/2009 16:41

Respuesta: ¿Redeclarar un clase?
 
Cita:

Iniciado por pateketrueke (Mensaje 2738297)
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

:pensando:

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

GermanBsAs 13/01/2009 22:52

Respuesta: ¿Redeclarar un clase?
 
Código PHP:


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

   class 
miClase
   
{
          public function 
__construct()
          {
          }
   }



enriqueplace 14/01/2009 05:05

Respuesta: ¿Redeclarar un clase?
 
Cita:

Iniciado por GermanBsAs (Mensaje 2742187)
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.

GermanBsAs 15/01/2009 15:40

Respuesta: ¿Redeclarar un clase?
 
Cita:

Iniciado por enriqueplace (Mensaje 2742398)
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_ */


GatorV 15/01/2009 15:57

Respuesta: ¿Redeclarar un clase?
 
O mejor usar require_once y te evitas ese problema :-)

Saludos.

enriqueplace 15/01/2009 17:14

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é?

dmks 28/01/2009 19:36

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

GatorV 28/01/2009 22:29

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 :adios:

enriqueplace 28/01/2009 22:37

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.


La zona horaria es GMT -6. Ahora son las 21:50.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.