Pregunta

Tengo una clase PHP con algunas constantes de clase que indican el estado de una instancia.

Cuando estoy usando la clase, después de ejecutar alguno de sus métodos, hago algunas comprobaciones para asegurarse de que el estado es lo que yo esperaba que fuera.

Por ejemplo, después de llamar a algunos métodos, espero que la situación sea MEANINGFUL_STATUS_NAME.

$objInstance->method1();
$objInstance->method2();
if ( $objInstance->status !==  class::MEANINGFUL_STATUS_NAME ) { 
    throw new Exception("Status is wrong, should not be " . class::MEANINGFUL_STATUS_NAME . ".");
}

Sin embargo, esto me da el mensaje de excepción

"Status is wrong, should not be 2"

cuando lo que realmente quiero ver es

"Status is wrong, should not be MEANINGFUL_STATUS_NAME"

Así que he perdido la significación del nombre de la constante. Yo estaba pensando en hacer un array 'tabla de traducción', por lo que puede tomar los valores constantes y traducir de nuevo en su nombre, pero esto parece engorroso. ¿Cómo debería traducir esta vuelta, por lo que me sale un mensaje de error que me da una mejor idea de lo que salió mal?

¿Fue útil?

Solución 2

Se me ocurre ahora que podía usar cadenas como los valores de las constantes. Estoy acostumbrado a ver los números. ¿Hay una razón por la que no debería hacer esto, o por qué esto no funcionaría?

Otros consejos

Esto es un poco difícil solución:

$r = new ReflectionClass("YourClassName");
$constantNames = array_flip($r->getConstants());

$objInstance->method1();   
$objInstance->method2();   
if ( $objInstance->status !== YourClassName::MEANINGFUL_STATUS_NAME ) {    
    throw new Exception("Status is wrong, should not be " . $constantNames[YourClassName::MEANINGFUL_STATUS_NAME] . ".");   
} 

Otra forma podría ser la de dejar que el cheque objeto si el estado está en el modo deseado.

Si no es así, el método del objeto puede emitir la excepción.

ejemplo no probado:

class Klasse
{
    const WANTED_VALUE    =  1;
    const UNWANTED_VALUE  =  2;

    private static $constant_names  =  array();
    p... function __construct ()
    {
        if ( empty( self::$constant_names ) )
        {
            $class            =  new ReflectionClass( __CLASS__ );
            $constants        =  $class->getConstants();
            $constants        =  array_flip( $constants );// requires the constant's values to be unique
            self::$constants  =  $constants;
        }
    }
    public function checkNeededStatus ()
    {
        $needed_status  =  self::WANTED_VALUE;// could also be a parameter(an argument) with a default value
        if ( $this->status !== $needed_status )
        {
            $constant_name  =  self::$constants[ $this->status ];
            $message        =  'Status is wrong, '
                . 'should not be: `' . $constant_name . '`.'
            ;
            //$message .=  '(it should be `' . self::$constants[ $needed_status ] . '`)';
            throw new Exception( $message );
        }
    }
}

$objInstance  =  new Klasse();
$objInstance->method1();
$objInstance->method2();
$objInstance->checkNeededStatus();

crédito:

Podría ser bueno tener en cuenta que no utilizan la reflexión. Debido a que las estancias de mensajes lanzados dentro de la clase, esto se ha vuelto más propensos a hacerlo sin perder mucho mantenimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top