Cita:
Iniciado por enriqueplace 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 B 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 C 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_ */