2011-11-28 9 views
5

Descubrí el patrón "Diseño por contrato" y cómo implementarlo en PHP. No puedo encontrar un ejemplo del mundo real de cómo hacer esto en PHP. Primera pregunta ¿lo estoy haciendo de la manera correcta? El segundo es ¿por qué no se respeta la devolución de llamada?¿Es esta la forma correcta de implementar el patrón "Diseño por contrato" en PHP?

Una clase estática Asserts para aseveraciones reutilizables:

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

Uso:

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.'); 

Sólo el aviso (derecha) se activa:

Advertencia: assert() [Función .assert]: Aserción "Asserts :: absetOrNotNumeric ($ value)" failed.

+0

¿Qué advertencia provoca? –

+0

@Mario ver mis ediciones, gracias. – gremo

Respuesta

4

Su excepción se está lanzando, alterando a:

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

resultados en una pantalla del texto, algunas pruebas descubren que si altera r esta opción

assert_options(ASSERT_BAIL,  false); 

se produce la excepción, por lo que parece que rescata a la ejecución antes de lanzar la excepción.

Espero que ayude

+0

Gracias! Tienes razón, resuelto. – gremo

-1

Su código: http://codepad.org/y10BlV8m

Mi código: http://codepad.org/slSX3HKd

Trate de usar comillas dobles: assert("Asserts::absentOrNotNumeric($value)");

+1

Nuevamente, no, 'assert' requiere comillas simples, consulte el ejemplo de [assert] (http://php.net/manual/en/function.assert.php) en el sitio web de PHP. – gremo

Cuestiones relacionadas