I like the idea a lot, although I'm not so sure of the proposed syntax.

I would make it less specific. Preconditions/Postconditions assertions are
indeed useful but the functionality could be extended to regular checks as
well by making the error user defined.

Plus, I would prefer having named checks rather than having the expression
repeated every time: it's great for reusability and signatures would be
shorter (... they are very lengthy already).

For instance:

public function offsetGet(int{NonNegative} $offset){}

function NonNegative(int $offset){
    if($offset < 0) throw new WhateverError;
}

If one wants them to act like assertions could still write:

function NonNegative(int $offset){
    assert($offset >= 0);
}

Some blue sky thinking code is here: http://pastie.org/10355629

Although, I'm not sure whether the validation function should be a simple
named function or a type:

public function baz(Foo{MyChecker} $foo);

interface MyChecker extends Validator{}

class MyStrictChecker implements MyChecker{
    function check($value){
        if($value < 10) throw new MyException;
    }
}

class MyDevChecker implements MyChecker{
    function check($value){
        assert($value >= 10);
    }
}

That could be useful, I believe, but kind of makes "the contract" too
abstract. What do you think?

Forgive my poor english.

Reply via email to