« Ritorna al blog
Ritorna alla lista completa degli articoli
Mettiti alla prova: estendere la classe Impiegato - Parte 4 di 4
PHP - SFIDE - novembre 19, 2021In questo esercizio estenderemo la classe Impiegato.class.php. Immaginiamo che una società abbia diversi livelli di inquadramento professionale.
La società è strutturata secondo questo ordine:
- manager
- quadro
- impiegato
- operaio
Ai fini del riutilizzo del codice vogliamo sfruttare la classe Impiegato.class.php già costruita nei precedenti esercizi ed estenderla a quella della qualifica di operaio, in quanto, entrambi hanno delle proprietà in comune. Come per l'impiegato anche per l'operaio è utile conoscere il suo nome, la data di nascita e la sua età.
Ipotizziamo che la società voglia conoscere sull'operaio, oltre al nome e la data di nascita, anche la data di assunzione e le ore di straordinario; inoltre, ai fini del calcolo dei costi e della produttività, la società vuole sapere la media delle ore complessive di straordinario svolte dagli operai dall'inizio del periodo di attività o di assunzione.
Dovrete quindi implementare una nuova classe chiamata Operaio.class.php seguendo alcuni accorgimenti. Il costruttore della classe operaio deve prevedere:
- Il nome, ereditato dalla classe Impiegato.class.php
- La data di nascita ereditato dalla classe Impiegato.class.php
- L'anno di assunzione. Nel caso il valore sia null deve essere stampato l'anno attuale
- Le ore di straordinario. Nel caso il valore sia null deve essere uguale a 0
Questo esercizio prevede dunque tre file:
- Il file Impiegato.class.php creato nel primo esercizio
- Il file Operaio.class.php
- Il file start.php
Nel file Operaio.class.php bisogna completare la parte di codice laddove viene scritto da completare. In questo caso ci sono due parti da completare:
- La prima dovrete richiamare il file di classe Impiegato.class.php
- La seconda è relativa al costruttore della classe Operaio.class.php
<!-- Classe Impiegato -->
<!-- Da completare -->
<?php
class Operaio extends Impiegato{
private $ann_ass;
private $ore_stra;
function __construct($nome, $ddn, $ann_ass = null, $ore_stra = null){
//da_completare
}
public function get_ann_ass(){
return $this->ann_ass;
}
public function get_ore_stra(){
return $this->ore_stra;
}
public function set_ore_stra(){
$this->ore_stra;
}
}
?>
Nel file start.php bisognerà, invece, richiamare la nuova classe Operaio.class.php e completare la funzione calc_media_ore_stra() che calcola la media delle ore di straordinario svolte dagli operai:
<!-- Classe Impiegato -->
<?php require_once("classi/Impiegato.class.php"); ?>
<!-- Classe Operaio -->
<!-- Da completare -->
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Esercizio: estendere la classe Impiegato</title>
</head>
<body>
<?php
// Calcolo media delle ore di straordinario
function calc_media_ore_stra($operai){
// da completare
}
// Visualizza un messaggio riepilogativo dell'operaio
function stampa_messaggio($operaio){
$msg = "<p>";
$msg .= $operaio->get_nome() . " ha " . $operaio->get_eta() . " anni ed ";
$msg .= "è stato assunto nell'anno " . $operaio->get_ann_ass() . ". ";
$msg .= "Ha fatto " . $operaio->get_ore_stra() . " ore di straordinario ad oggi.";
$msg .= "</p>";
return $msg;
}
// Visualizza il risultato della media delle ore di straordinario
function stampa_media_ore_stra($operai){
$media = calc_media_ore_stra($operai);
$msg = "<p>";
$msg .= "La media delle ore di straordinario è di: " . $media . " ore.";
$msg .= "</p>";
return $msg;
}
$matteo = new Operaio("Matteo","1950-04-20","2010",50.3);
$luca = new Operaio("Luca","19640-07-13","2008",8.0);
$giovanni = new Operaio("Giovanni","1972-11-05","2012",32.3);
$michele = new Operaio("Michele","1960-03-11");
echo stampa_messaggio($matteo);
echo stampa_messaggio($luca);
echo stampa_messaggio($giovanni);
echo stampa_messaggio($michele);
echo stampa_media_ore_stra([$matteo,$luca,$giovanni,$michele]);
?>
</body>
</html>
Una volta completato l'esercizio dovreste ottenere il seguente output:
Matteo ha 71 anni ed è stato assunto nell'anno 2010. Ha fatto 50.3 ore di straordinario ad oggi.
Luca ha 21 anni ed è stato assunto nell'anno 2008. Ha fatto 8 ore di straordinario ad oggi.
Giovanni ha 49 anni ed è stato assunto nell'anno 2012. Ha fatto 32.3 ore di straordinario ad oggi.
Michele ha 61 anni ed è stato assunto nell'anno 2021. Ha fatto 0 ore di straordinario ad oggi.
La media delle ore di straordinario è di: 22.65 ore.
Per vedere la soluzione completa devi essere un utente registrato
File Impiegato.class.php
<?php
class Impiegato {
private $nome;
private $ddn;
function __construct($nome, $ddn){
$this->nome = $nome;
$this->ddn = $ddn;
}
public function get_nome(){
return $this->nome;
}
public function get_eta(){
// da completare
$data1 = new DateTime($this->ddn);
$data2 = new DateTime(date('Y-m-d'));
$eta = $data2->diff($data1);
return $eta->y;
}
}
?>
File Operaio.class.php
<!-- Classe Impiegato -->
<?php require_once("classi/Impiegato.class.php"); ?>
<?php
class Operaio extends Impiegato{
private $ann_ass;
private $ore_stra;
function __construct($nome, $ddn, $ann_ass = null, $ore_stra = null){
//da_completare
parent::__construct($nome,$ddn);
$this->ann_ass = ( ! is_null($ann_ass)) ? $ann_ass : date('Y');
$this->ore_stra = ( ! is_null($ore_stra)) ? $ore_stra : 0;
}
public function get_ann_ass(){
return $this->ann_ass;
}
public function get_ore_stra(){
return $this->ore_stra;
}
public function set_ore_stra(){
$this->ore_stra;
}
}
?>
File finish.php
<!-- Classe Impiegato -->
<?php require_once("classi/Impiegato.class.php"); ?>
<!-- Classe Operaio -->
<?php require_once("classi/Operaio.class.php"); ?>
<!DOCTYPE html>
<html lang="it">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Esercizio: estendere la classe Impiegato</title>
</head>
<body>
<?php
// Calcolo media delle ore di straordinario
function calc_media_ore_stra($operai){
// da completare
$totale = 0.00;
foreach($operai as $operaio){
$totale += $operaio->get_ore_stra();
}
return $totale/sizeof($operai);
}
// Visualizza un messaggio riepilogativo dell'operaio
function stampa_messaggio($operaio){
$msg = "<p>";
$msg .= $operaio->get_nome() . " ha " . $operaio->get_eta() . " anni ed ";
$msg .= "è stato assunto nell'anno " . $operaio->get_ann_ass() . ". ";
$msg .= "Ha fatto " . $operaio->get_ore_stra() . " ore di straordinario ad oggi.";
$msg .= "</p>";
return $msg;
}
// Visualizza il risultato della media delle ore di straordinario
function stampa_media_ore_stra($operai){
$media = calc_media_ore_stra($operai);
$msg = "<p>";
$msg .= "La media delle ore di straordinario è di: " . $media . " ore.";
$msg .= "</p>";
return $msg;
}
$matteo = new Operaio("Matteo","1950-04-20","2010",50.3);
$luca = new Operaio("Luca","19640-07-13","2008",8.0);
$giovanni = new Operaio("Giovanni","1972-11-05","2012",32.3);
$michele = new Operaio("Michele","1960-03-11");
echo stampa_messaggio($matteo);
echo stampa_messaggio($luca);
echo stampa_messaggio($giovanni);
echo stampa_messaggio($michele);
echo stampa_media_ore_stra([$matteo,$luca,$giovanni,$michele]);
?>
</body>
</html>