Le eccezioni in PHP

ago 20th, 2009 | Filed under PHP, Snippet

Link sponsorizzati

Molti di quelli che vengono dai linguaggi ad oggetti come C#, Java oppure lo stesso C++, sanno benissimo che esiste uno strumento come le eccezioni per gestire eventuali errori. Bene, fortunatamente, questo strumento, è stato aggiunto anche in php, dalla versione 5 in poi.

Prendiamo in considerazione questa semplicissima classe

Link sponsorizzati

<?php
class Calc {
    public function sum($a, $b) {
        return $a + $b;
    }
    public function sub($a, $b) {
        return $a - $b;
    }

    public function mol($a, $b) {
        return $a * $b;
    }

    public function div($a, $b) {
        if($b == 0)
            die("Division by Zero");
        return $a / $b;
    }
}
?>

Come vedete, l’eventuale errore di division by zero, è stato gestito tramite un die. Si può fare diversamente? La risposta è si, si può gestire l’errore in maniera diversa, notificando tramite un’eccezione il problema riscontrato!

<?php

class Calc {
    public function sum($a, $b) {
        return $a + $b;
    }
    public function sub($a, $b) {
        return $a - $b;
    }

    public function mol($a, $b) {
        return $a * $b;
    }

    public function div($a, $b) {
        if($b == 0)
            throw new Exception("Division by Zero");
        return $a / $b;
    }
}

try {
    $c = new Calc();
    $c->div(1, 0);
}catch(Exception $e) {
    echo $e->getMessage();
}
?>

La classe Exception è presente di default in php. Tale classe può essere anche sottoposta ad overloading in modo tale da creare un classe che gestisce le eccezioni come ci pare a noi.

Vediamo per esempio ora come fare, questa è la definizione data dal PHP della classe Exception.

Exception {
    /* Properties */
   protected string $message ;
   private string $string ;
   protected int $code ;
   protected string $file ;
   protected int $line ;
   private array $trace ;
   /* Methods */
   public __construct ([ string $message= "" [, int $code= 0 [, Exception $previous= NULL ]]] )
   final public string getMessage ( void )
   final public Exception getPrevious ( void )
   final public int getCode ( void )
   final public string getFile ( void )
   final public int getLine ( void )
   final public array getTrace ( void )
   final public string getTraceAsString ( void )
   public string __toString ( void )
   final private void __clone ( void )
}

Come vedete, di questi metodi, l’unico che possiamo sottoporre ad overriding è il metodo __toString (). Ma cos’è questo metodo? Questo è un metodo davvero singolare, che permette di stampare informazioni direttamente mandando in echo l’istanza della classe. Ovvero

$obj = new myObj();
echo $obj;

Se nella classe myObj ho previsto un metodo __toString, allora esso sarà chiamato in quell’echo.

Ma, tornando al sodo, è vero che non possiamo modificare quelle funzioni, ma nessuno ci vieta di definirne altre. Io, per fare l’esempio, sottoporrò ad overriding il metodo di cui ho parlato sopra!

Questo l’esempio completo, creando una nuova classe che ridefinisce il metodo di cui parlavo

<?php

class myExcept extends Exception {
    public function __toString () {
        return "Eccezione sollevata <br/>".
               "Messaggio: ".$this->message." <br />".
               "Codice: ".$this->code." <br />".
               "File: ".$this->file." <br />".
               "Linea: ".$this->line;
    }
}

class Calc {
    public function sum($a, $b) {
        return $a + $b;
    }
    public function sub($a, $b) {
        return $a - $b;
    }

    public function mol($a, $b) {
        return $a * $b;
    }

    public function div($a, $b) {
        if($b == 0)
            throw new myExcept("Division by Zero", 0);
        return $a / $b;
    }
}

try {
    $c = new Calc();
    $c->div(1, 0);
}catch(myExcept $e) {
    echo $e;
}
?>

Link sponsorizzati

Se ti è piaciuto l'articolo condividilo!

Post correlati:

Tags: ,
Non sono ancora stati lasciati commenti.