Это правильный способ реализации шаблона «Дизайн по контракту» в PHP? - PullRequest
5 голосов
/ 28 ноября 2011

Я обнаружил шаблон «Проектирование по контракту» и как его реализовать в PHP. Я не могу найти реальный пример того, как это сделать в PHP. Первый вопрос я делаю это правильно? Второй - , почему обратный вызов assert не выполняется?

Статический класс Asserts для многоразовых утверждений:

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

Использование:

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

Только (справа) предупреждение срабатывает:

Предупреждение: assert () [function.assert]: утверждение Ошибка «Asserts :: absetOrNotNumeric ($ value)».

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

Ваше исключение выдается, изменяя его на:

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

приводит к отображению текста, некоторые тесты обнаруживают, что если вы измените эту опцию

assert_options(ASSERT_BAIL,     false);

Исключениебудет сгенерировано, поэтому кажется, что оно освобождает от выполнения до выдачи исключения.

Надеюсь, что поможет

0 голосов
/ 28 ноября 2011

Ваш код: http://codepad.org/y10BlV8m

Мой код: http://codepad.org/slSX3HKd

Попробуйте использовать двойные кавычки: assert("Asserts::absentOrNotNumeric($value)");

...