2011-11-28 15 views
5

Ho scoperto il modello "Design by contract" e come implementarlo in PHP. Non riesco a trovare un vero esempio di come farlo in PHP. Prima domanda sto sto facendo nel modo giusto? Il secondo è perché il richiamo non è rispettato?È questo il modo giusto di implementare lo schema "Design per contratto" in PHP?

una classe statica Asserts per affermazioni riutilizzabili:

class Asserts 
{ 
    public static function absentOrNotNumeric($value) 
    { 
     return !isset($value) ? true : is_numeric($value); 
    } 
} 

Usage:

assert_options(ASSERT_ACTIVE, true); 
assert_options(ASSERT_BAIL,  true); 
assert_options(ASSERT_WARNING, true); 
assert_options(ASSERT_CALLBACK, array('UseAsserts', 'onAssertFailure')); 

class UseAsserts 
{ 
    private $value; 

    public function __construct($value) 
    { 
     // Single quotes are needed otherwise you'll get a 
     // Parse error: syntax error, unexpected T_STRING 
     assert('Asserts::absentOrNotNumeric($value)'); 
     $this->value = $value; 
    } 

    public static function onAssertFailure($file, $line, $message) 
    { 
     throw new Exception($message); 
    } 
} 

// This will trigger a warning and stops execution, but Exception is not thrown 
$fail = new UseAsserts('Should fail.'); 

(a destra) di allarme viene attivato solo:

Attenzione: assert() [funzione .assert]: Asserzione "Asserzioni :: absetOrNotNumeric (valore $)" non riuscita.

+0

Che avviso si attiva? –

+0

@ Mario vedi le mie modifiche, grazie. – gremo

risposta

4

tuo eccezione è stato gettato, alterando a:

public static function onAssertFailure($file, $line, $message) 
{ 
    echo "<hr>Assertion Failed: 
    File '$file'<br /> 
    Line '$line'<br /> 
    Code '$code'<br /><hr />"; 
} 

risultati in una visualizzazione del testo, alcuni test scoprono che se si alte r questa opzione

assert_options(ASSERT_BAIL,  false); 

verrà generata l'eccezione, così sembra che balle sull'esecuzione prima lanciare l'eccezione.

Speranza che aiuti

+0

Grazie! Hai ragione, risolto. – gremo

-1

tuo codice: http://codepad.org/y10BlV8m

Il mio codice: http://codepad.org/slSX3HKd

Provate ad usare le virgolette doppie: assert("Asserts::absentOrNotNumeric($value)");

+1

Ancora no, 'assert' richiede virgolette singole, vedi esempio [asser] (http://php.net/manual/en/function.assert.php) sul sito web di PHP. – gremo

Problemi correlati