Mi consulta es la siguiente: ¿Cómo deberia separar los archivos y como deberia invocar los include_once para que el siguiente sistemita de clases funcione? Porque en este codigo lo tengo todo junto en un mismo archivo php.
Mi idea es aprender una buena costumbre de como armar las clases ordenadamente y ustedes que tienen experiencia quiza me puedan dar una mano.
Bueno el codigo es el un simple ejemplo de un video club:
Código PHP:
class soporte{
public $titulo;
protected $numero;
private $precio;
function __construct($tit,$num,$precio){
$this->titulo = $tit;
$this->numero = $num;
$this->precio = $precio;
}
public function dame_precio_sin_iva(){
return $this->precio;
}
public function dame_precio_con_iva(){
return $this->precio * 1.16;
}
public function dame_numero_identificacion(){
return $this->numero;
}
public function imprime_caracteristicas(){
echo $this->titulo;
echo "<br>" . $this->precio . " (IVA no incluido)";
}
}
class cinta_video extends soporte{
private $duracion;
function __construct($tit,$num,$precio,$duracion){
parent::__construct($tit,$num,$precio);
$this->duracion = $duracion;
}
public function imprime_caracteristicas(){
echo "Película en VHS:<br>";
parent::imprime_caracteristicas();
echo "<br>Duración: " . $this->duracion;
}
}
class dvd extends soporte{
public $idiomas_disponibles;
private $formato_pantalla;
function __construct($tit,$num,$precio,$idiomas,$pantalla){
parent::__construct($tit,$num,$precio);
$this->idiomas_disponibles = $idiomas;
$this->formato_pantalla = $pantalla;
}
public function imprime_caracteristicas(){
echo "Película en DVD:<br>";
parent::imprime_caracteristicas();
echo "<br>" . $this->idiomas_disponibles;
}
}
class juego extends soporte{
public $consola; //nombre de la consola del juego ej: playstation
private $min_num_jugadores;
private $max_num_jugadores;
function __construct($tit,$num,$precio,$consola,$min_j,$max_j){
parent::__construct($tit,$num,$precio);
$this->consola = $consola;
$this->min_num_jugadores = $min_j;
$this->max_num_jugadores = $max_j;
}
public function imprime_jugadores_posibles(){
if ($this->min_num_jugadores == $this->max_num_jugadores){
if ($this->min_num_jugadores==1)
echo "<br>Para un jugador";
else
echo "<br>Para " . $this->min_num_jugadores . " jugadores";
}else{
echo "<br>De " . $this->min_num_jugadores . " a " . $this->max_num_jugadores . " Jugadores.";
}
}
public function imprime_caracteristicas(){
echo "Juego para: " . $this->consola . "<br>";
parent::imprime_caracteristicas();
echo "<br>" . $this->imprime_jugadores_posibles();
}
}
class cliente{
public $nombre;
private $numero;
private $soportes_alquilados;
private $num_soportes_alquilados;
private $max_alquiler_concurrente;
function __construct($nombre,$numero,$max_alquiler_concurrente=3){
$this->nombre=$nombre;
$this->numero=$numero;
$this->soportes_alquilados=array();
$this->num_soportes_alquilados=0;
$this->max_alquiler_concurrente = $max_alquiler_concurrente;
//inicializo las casillas del array de alquiler a "null"
//un valor "null" quiere decir que el no hay alquiler en esa casilla
for ($i=0;$i<$max_alquiler_concurrente;$i++){
$this->soportes_alquilados[$i]=null;
}
}
function dame_numero(){
return $this->numero;
}
function tiene_alquilado($soporte){
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){
if ($this->soportes_alquilados[$i]->dame_numero_identificacion() == $soporte->dame_numero_identificacion()){
return true;
}
}
}
//si estoy aqui es que no tiene alquilado ese soporte
return false;
}
function alquila($soporte){
if ($this->tiene_alquilado($soporte)){
echo "<p>El cliente ya tiene alquilado el soporte <b>" . $soporte->titulo . "</b>";
}elseif ($this->num_soportes_alquilados==$this->max_alquiler_concurrente){
echo "<p>Este cliente tiene " . $this->num_soportes_alquilados . " elementos alquilados. ";
echo "No puede alquilar más en este videoclub hasta que no devuelva algo";
}else{
//miro en el array a ver donde tengo sitio para meter el soporte
$cont = 0;
while (!is_null($this->soportes_alquilados[$cont])){
$cont++;
}
$this->soportes_alquilados[$cont]=$soporte;
$this->num_soportes_alquilados++;
echo "<p><b>Alquilado soporte a: </b>" . $this->nombre . "<br>";
$soporte->imprime_caracteristicas();
}
}
function devuelve($identificador_soporte){
if ($this->num_soportes_alquilados==0){
echo "<p>Este cliente no tiene alquilado ningún elemento";
return false;
}
//recorro el array a ver si encuentro el soporte con identificador recibido
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){
if ($this->soportes_alquilados[$i]->dame_numero_identificacion() == $identificador_soporte){
echo "<p>Soporte devuelto: " . $identificador_soporte;
echo " <b>" . $this->soportes_alquilados[$i]->titulo . "</b>";
$this->soportes_alquilados[$i]=null;
$this->num_soportes_alquilados--;
return true;
}
}
}
//si estoy aqui es que el cliente no tiene ese soporte alquilado
echo "<p>No se ha podido encontrar el soporte en los alquileres de este cliente";
return false;
}
function lista_alquileres(){
if ($this->num_soportes_alquilados==0){
echo "<p>Este cliente no tiene alquilado ningún elemento";
}else{
echo "<p><b>El cliente tiene " . $this->num_soportes_alquilados . " soportes alquilados</b>";
//recorro el array para listar los elementos que tiene alquilados
for ($i=0;$i<$this->max_alquiler_concurrente;$i++){
if (!is_null($this->soportes_alquilados[$i])){
echo "<p>";
$this->soportes_alquilados[$i]->imprime_caracteristicas();
}
}
}
}
function imprime_caracteristicas(){
echo "<p><b>Cliente " . $this->numero . ":</b> " . $this->nombre;
echo "<br>Alquileres actuales: " . $this->num_soportes_alquilados;
}
}
//instanciamos un par de objetos cliente
$cliente1 = new cliente("Pepe", 1);
$cliente2 = new cliente("Roberto", 564);
//mostramos el numero de cada cliente creado
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero();
echo "<br>El identificador del cliente 2 es: " . $cliente2->dame_numero();
//instancio algunos soportes
$soporte1 = new cinta_video("Los Otros", 1, 3.5, "115 minutos");
$soporte2 = new juego("Final Fantasy", 2, 2.5, "Playstation",1,1);
$soporte3 = new dvd("Los Intocables", 3, 3, "Inglés y español","16:9");
$soporte4 = new dvd("El Imperio Contraataca", 4, 3, "Inglés y español","16:9");
//alquilo algunos soportes
$cliente1->alquila($soporte1);
$cliente1->alquila($soporte2);
$cliente1->alquila($soporte3);
//voy a intentar alquilar de nuevo un soporte que ya tiene alquilado
$cliente1->alquila($soporte1);
//el cliente tiene 3 soportes en alquiler como máximo
//este soporte no lo va a poder alquilar
$cliente1->alquila($soporte4);
//este soporte no lo tiene alquilado
$cliente1->devuelve(4);
//devuelvo un soporte que sí que tiene alquilado
$cliente1->devuelve(2);
//alquilo otro soporte
$cliente1->alquila($soporte4);
//listo los elementos alquilados
$cliente1->lista_alquileres();