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.