Tenia un poco de tiempo asì que hice un ejemplo a partir de tu clase original, la cual lo único que hace es guardar la información que querías y cree dos clases adicionales una que solo se encarga de calcular el sueldo a partir de un porcentaje como lo tenìas pensado y otra que se encarga de proporcionar el sueldo que requiere el Empleado cuando es contratado o promovido a un puesto, es algo sencillo que se puede refactorizar pero espero que te ayude.
Código PHP:
Ver originalclass Empleado
{
private $nombre;
private $apellidos;
private $dni;
private $sueldoAnual;
private function __construct($nombre, $apellidos, $dni, $sueldoAnual) {
$this->setNombre($nombre);
$this->setApellidos($apellidos);
$this->setDni($dni);
$this->setSueldoAnual($sueldoAnual);
}
public static function contratar($nombre, $apellidos, $dni, $sueldoAnual)
{
return new static($nombre, $apellidos, $dni, $sueldoAnual);
}
public function promover($sueldo)
{
$this->setSueldoAnual($sueldo);
return $this;
}
public function getPrimerApellido() {
$porcion = explode(" ", $this->getApellidos()); return $porcion[0];
}
public function getSegundoApellido() {
$porcion = explode(" ", $this->getApellidos()); if (!isset($porcion[1])) { return null;
}
return $porcion[1];
}
public function getNombre() {
return $this->nombre;
}
public function getApellidos() {
return $this->apellidos;
}
public function getDni() {
return $this->dni;
}
public function getSueldoAnual() {
return $this->sueldoAnual;
}
public function setNombre($nombre) {
$this->nombre = $nombre;
}
public function setApellidos($apellidos) {
$this->apellidos = $apellidos;
}
public function setDni($dni) {
$this->dni = $dni;
}
private function setSueldoAnual($sueldoAnual) {
$this->sueldoAnual = $sueldoAnual;
}
}
Código PHP:
Ver originalclass Tabulador
{
private $sueldoAnual;
public function __construct($sueldoAnual)
{
$this->sueldoAnual = $sueldoAnual;
}
public function ascender($porcentaje = 0) {
$nuevoSueldo = $this->sueldoAnual + $this->porcentaje($porcentaje);
return $nuevoSueldo;
}
private function porcentaje($porcentaje) {
return $this->sueldoAnual * $porcentaje / 100;
}
}
Código PHP:
Ver originalclass RecursosHumanos
{
private $tabulador;
/**
* @var Empleado
*/
private $empleado;
private $sueldo = null;
public function __construct(Tabulador $tabulador)
{
$this->tabulador = $tabulador;
}
public function contratar
(Array $persona = []) {
$this->empleado = $persona;
return $this;
}
public function promover(Empleado $empleado)
{
$this->empleado = $empleado;
return $this;
}
public function para($puesto)
{
switch($puesto){
case 'Programador':
$this->sueldo = $this->tabulador->ascender();
break;
case 'Lider':
$this->sueldo = $this->tabulador->ascender(10);
break;
}
return Empleado::contratar(...$this->empleado);
} else {
return $this->empleado->promover($this->sueldo);
}
}
}
Ejempo de uso
Código PHP:
Ver original$sueldo_base = 40000.00;
$persona = [
'Juan Carlos',
'Rodriguez',
123456,
];
$tabulador = new Tabulador($sueldo_base);
$rh = new RecursosHumanos($tabulador);
$empleado = $rh->contratar($persona)->para('Programador');
print_r($empleado->getSueldoAnual());
$empleado = $rh->promover($empleado)->para('Lider');
print_r($empleado->getSueldoAnual());