Está en la página 1de 15

PROGRAMACIÓN AVANZADA I

SEMANA 3

Darío Salguero
27-06-2022
Técnico Superior en Informática
DESARROLLO
1. Tomando en cuenta el requerimiento, generaremos la clase Persona como abstracta y de ella
heredarán los atributos las clases Alumno y Apoderado.
Ya que no se puede instanciar clases abstractas, se instanciarán los objetos en las clases Alumno y
Apoderado.

/**
* DEFINICION DE CLASE ABSTRACTA
*/
abstract class PERSONA
{
private $strNombres;
private $strApellidos;
private $strRut;
private $strDireccion;

function __construct(string $nombres, string $apellidos, string $rut, string $direccion)


{
$this->strNombres = $nombres;
$this->strApellidos = $apellidos;
$this->strRut = $rut;
$this->strDireccion = $direccion;
}

public function getDatosPersonales(string $tipo_persona)


{
$datosPersonales = "
<h2>{$tipo_persona}</h2>
<b>NOMBRE:</b> {$this->strNombres} {$this->strApellidos}<br>
<b>RUT:</b> {$this->strRut}<br>
<b>DIRECCION:</b> {$this->strDireccion}<br>
";
return $datosPersonales;
}
}
Para el ejemplo usaremos un trait (rasgo) que será Colegio y al que se accederá desde la clase
Alumno. Ya que no se puede heredar atributos de 2 clases, heredamos los atributos de la clase
Persona y generamos el trait Colegio para de este modo utilizar los atributos configurados en el
mismo. Como no se puede instanciar un trait, generamos una clase adicional que utilice el trait y
de este modo podemos instanciar un objeto que asigne un valor para los datos asociados al
colegio.

/**
* DEFINICION DE TRAIT
*/
trait COLEGIO
{
public $strColegio;
public $strAnio;

public function setColegio(string $colegio, string $anio)


{
$this->strColegio = $colegio;
$this->strAnio = $anio;
}

public function getColegio()


{
$strInfoColegio = "
<strong>COLEGIO:</strong> {$this->strColegio} <br>
<strong>A&Ntilde;O:</strong> {$this->strAnio} <br><br>
";
return $strInfoColegio;
}
}

class TraitColegio
{
use COLEGIO;
}

trait usoDeTraitColegio
{
use COLEGIO;
}

/**
* CLASE HIJA
*/
class ALUMNO extends PERSONA
{
use usoDeTraitColegio; //USO DE PROPIEDADES DEL TRAIT COLEGIO

//protected $strAsignaturas;
protected $strActividadesExtracurriculares;

function __construct(string $nombres, string $apellidos, string $rut, string $direccion)


{
parent::__construct($nombres, $apellidos, $rut, $direccion);
}

/*final */public function setDatosAlumno(/*string $asignaturas, */string


$actividades_extracurriculares)
{
//$this->strAsignaturas = $asignaturas;
$this->strActividadesExtracurriculares = $actividades_extracurriculares;
}

public function getDatosAlumno()


{
$datosAlumno =
//"<b>ASIGNATURAS:</b> {$this->strAsignaturas}<br>
"<b>ACTIVIDADES EXTRACURRICULARES:</b> {$this-
>strActividadesExtracurriculares}<br>
";
return $datosAlumno;
}
}
Para el uso de clases anónimas en este caso lo haré para el ingreso de las asignaturas
correspondientes al alumno. Esto será implementado justo después de la creación del objeto
alumno.

$asig = new class()


{
public $asignaturas;

public function set_asig($listaAsignaturas)


{
$this->asignaturas = $listaAsignaturas;
}

public function get_asig()


{
echo "<strong>ASIGNATURAS: </strong>" . $this->asignaturas . "<br>";
}
};
Utilicé los métodos mágicos __set() y __get() en la clase APODERADO para asignar y obtener el valor de la
propiedad Pupilo y la iteración se realiza en caso que el apoderado tenga más de un alumno como pupilo.
En este caso se podría guardar los nombres de los distintos pupilos en un array y utilizar foreach para
mostrar todos los elementos del array correspondientes al apoderado para las propiedades visibles
utilizando ::iterateVisible.

/**
* CLASE HIJA
*/
class APODERADO extends PERSONA
{
private $strNombrePupilo;

public function __construct(string $nombres, string $apellidos, string $rut, string


$direccion)
{
parent::__construct($nombres, $apellidos, $rut, $direccion);
}

public function __set($nombre, $valor)


{
$this->strNombrePupilo = $valor;
}

public function __get($nombre)


{
echo "<strong>PUPILO:</strong> " . $this->strNombrePupilo;
}
}
?>
El uso de la palabra clave final lo probé en la clase ALUMNO para el ingreso de las actividades
extracurriculares. Generé una clase adicional ACTEXT hija de la clase ALUMNO en la cual
sobreescribo las actividades extracurriculares ingresadas en la clase ALUMNO.

/**
* CLASE ACTIVIDADES EXTRACURRICULARES7
*/
class ACTEXT extends ALUMNO
{
protected $strActividadesExtracurriculares;

public function setDatosAlumno(/*string $asignaturas, */string $actividades_extracurriculares)


{
//$this->strAsignaturas = $asignaturas;
$this->strActividadesExtracurriculares = $actividades_extracurriculares;
}

public function getDatosAlumno()


{
$datosAlumno =
//"<b>ASIGNATURAS:</b> {$this->strAsignaturas}<br>
"<b>ACTIVIDADES EXTRACURRICULARES:</b> {$this->strActividadesExtracurriculares}<br>
";
return $datosAlumno;
}
}
Al añadir la palabra clave final en la función setDatosAlumno arroja el error esperado al tratar de
sobreescribir el método.

final public function setDatosAlumno(/*string $asignaturas, */string


$actividades_extracurriculares)

A continuación incluyo el código completo desarrollado.

index.php

<?php
require_once("clases.php");

$objAlumno = new ALUMNO("Carlos Alberto","Vargas Soza","23.456.789-0","Alcantara 200, Las


Condes");
$objAlumno->setDatosAlumno("Basketball, Ajedrez");

$objAlumno2 = new ACTEXT("Carlos Alberto", "Vargas Soza", "23.456.789-0", "Alcantara 200, Las
Condes");
$objAlumno2->setDatosAlumno("Futbol, M&uacute;sica");

$asig = new class()


{
public $asignaturas;

public function set_asig($listaAsignaturas)


{
$this->asignaturas = $listaAsignaturas;
}

public function get_asig()


{
echo "<strong>ASIGNATURAS: </strong>" . $this->asignaturas . "<br>";
}
};

echo $objAlumno->getDatosPersonales("Alumno");
echo $objAlumno->getDatosAlumno();

echo $objAlumno2->getDatosPersonales("Alumno");
echo $objAlumno2->getDatosAlumno();

echo "<br>";

$asig->set_asig("Matemáticas, Física, Química, Literatura");


echo $asig->get_asig();

$objColegio = new TraitColegio();


$objColegio->setColegio("Colegio Marista", "4to");
echo $objColegio->getColegio();

$objApoderado = new APODERADO("Jorge Antonio", "Vargas Jeldres", "14.567.321-K", "Alcantara


200, Las Condes");
$objApoderado->strNombrePupilo = "Carlos Alberto Vargas Soza";

echo $objApoderado->getDatosPersonales("Apoderado");
echo $objApoderado->strNombrePupilo;

?>

clases.php

<?php
/**
* DEFINICION DE CLASE ABSTRACTA
*/
abstract class PERSONA
{
private $strNombres;
private $strApellidos;
private $strRut;
private $strDireccion;

function __construct(string $nombres, string $apellidos, string $rut, string $direccion)


{
$this->strNombres = $nombres;
$this->strApellidos = $apellidos;
$this->strRut = $rut;
$this->strDireccion = $direccion;
}

public function getDatosPersonales(string $tipo_persona)


{
$datosPersonales = "
<h2>{$tipo_persona}</h2>
<b>NOMBRE:</b> {$this->strNombres} {$this->strApellidos}<br>
<b>RUT:</b> {$this->strRut}<br>
<b>DIRECCION:</b> {$this->strDireccion}<br>
";
return $datosPersonales;
}
}

/**
* DEFINICION DE TRAIT
*/
trait COLEGIO
{
public $strColegio;
public $strAnio;

public function setColegio(string $colegio, string $anio)


{
$this->strColegio = $colegio;
$this->strAnio = $anio;
}

public function getColegio()


{
$strInfoColegio = "
<strong>COLEGIO:</strong> {$this->strColegio} <br>
<strong>A&Ntilde;O:</strong> {$this->strAnio} <br><br>
";
return $strInfoColegio;
}
}

class TraitColegio
{
use COLEGIO;
}
trait usoDeTraitColegio
{
use COLEGIO;
}

/**
* CLASE HIJA
*/
class ALUMNO extends PERSONA
{
use usoDeTraitColegio; //USO DE PROPIEDADES DEL TRAIT COLEGIO

//protected $strAsignaturas;
protected $strActividadesExtracurriculares;

function __construct(string $nombres, string $apellidos, string $rut, string $direccion)


{
parent::__construct($nombres, $apellidos, $rut, $direccion);
}

/*final */public function setDatosAlumno(/*string $asignaturas, */string


$actividades_extracurriculares)
{
//$this->strAsignaturas = $asignaturas;
$this->strActividadesExtracurriculares = $actividades_extracurriculares;
}

public function getDatosAlumno()


{
$datosAlumno =
//"<b>ASIGNATURAS:</b> {$this->strAsignaturas}<br>
"<b>ACTIVIDADES EXTRACURRICULARES:</b> {$this-
>strActividadesExtracurriculares}<br>
";
return $datosAlumno;
}
}

/**
* CLASE ACTIVIDADES EXTRACURRICULARES7
*/
class ACTEXT extends ALUMNO
{
protected $strActividadesExtracurriculares;

public function setDatosAlumno(/*string $asignaturas, */string $actividades_extracurriculares)


{
//$this->strAsignaturas = $asignaturas;
$this->strActividadesExtracurriculares = $actividades_extracurriculares;
}

public function getDatosAlumno()


{
$datosAlumno =
//"<b>ASIGNATURAS:</b> {$this->strAsignaturas}<br>
"<b>ACTIVIDADES EXTRACURRICULARES:</b> {$this->strActividadesExtracurriculares}<br>
";
return $datosAlumno;
}
}

/**
* CLASE HIJA
*/
class APODERADO extends PERSONA
{
private $strNombrePupilo;

public function __construct(string $nombres, string $apellidos, string $rut, string


$direccion)
{
parent::__construct($nombres, $apellidos, $rut, $direccion);
}

public function __set($nombre, $valor)


{
$this->strNombrePupilo = $valor;
}

public function __get($nombre)


{
echo "<strong>PUPILO:</strong> " . $this->strNombrePupilo;
}
}
?>
VISTA GRÁFICA DE LAS CLASES
REFERENCIAS BIBLIOGRÁFICAS
IACC. (2022). Programación Avanzada I. Programación Orientada a Objetos con PHP. Semana 2

Curso PHP8 desde cero. https://www.youtube.com/watch?v=_rEj-RE8cLs&list=PLZ2ovOgdI-


kUSqWuyoGJMZL6xldXw6hIg&index=1

También podría gustarte