« Ritorna al blog

Ritorna alla lista completa degli articoli

Mettiti alla prova: estendere la classe Impiegato - Parte 4 di 4

PHP - SFIDE - novembre 19, 2021

In questo esercizio estenderemo la classe Impiegato.class.php. Immaginiamo che una società abbia diversi livelli di inquadramento professionale.

La società è strutturata secondo questo ordine:

  1. manager
  2. quadro
  3. impiegato
  4. 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:

  1. Il nome, ereditato dalla classe Impiegato.class.php
  2. La data di nascita ereditato dalla classe Impiegato.class.php
  3. L'anno di assunzione. Nel caso il valore sia null deve essere stampato l'anno attuale
  4. Le ore di straordinario. Nel caso il valore sia null deve essere uguale a 0

Questo esercizio prevede dunque tre file:

  1. Il file Impiegato.class.php creato nel primo esercizio
  2. Il file Operaio.class.php
  3. 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:

  1. La prima dovrete richiamare il file di classe Impiegato.class.php
  2. 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>
Mettiti alla prova: estendere la classe Impiegato - Parte 4 di 4