Hi Dmitry,

> De : Dmitry Stogov [mailto:dmi...@zend.com]
> Envoyé : lundi 9 février 2015 12:05
> À : Joe Watkins
> Cc : Yasuo Ohgaki; Stanislav Malyshev; PHP Internals
> Objet : Re: [PHP-DEV] Design by Contract
> 
> invariant is for classes only. It should be called before and/or after each
> method to check object consistency.
> 
> syntax with expressions may work if we put constraints before the function
> body .
> 
> function foo($a int): int
>     require(expr1)
>     require(expr2, msg)
>     return(expr3)
> {
> }

I understand you're defining an implementation based on assertions only, 
despite the fact that 'require' and 'return' are very ambiguous choices IMO.

Did you take into account that, in many cases, this would revert to strict type 
checking, due to the way is_xxx() functions are working ?

If someone writes 'function tan($op) / require (is_float($op));' will he expect 
tan(1) to be rejected ? (we're back to Rasmus' complaint).

The same with is_int() and others, they're all based on zval types. Only 
is_numeric() is smarter and allows specifying a 'number' in the PHP way. 
Unfortunately, these functions are wrong as they don't fit with the way people 
are used to consider types in PHP. So, no easy way to say you can accept 1 or 
1.0, let alone "1".

That's why my proposal features assertions AND 'smart' argument types. 
Actually, types are more important than assertions because that's what people 
will use first. Primary use for assertions will be checking conditions between 
args. The same for properties and return type. Actually, I would say that most 
phpdoc-annotated code already contains most DbC constraints it needs. We just 
need to formalize and use them.

As others already said here, be it for type checking or DbC, we need a 
mechanism to interpret types the 'PHP' way, something between PHP permissive 
type juggling and strict zval-based typing. That's what I tried to define.

I understand the prevention against inserting PHP code in doc comments and, if 
I was designing the language from scratch, I wouldn't use such a design. But, 
considering every aspects of the problem, I still think it's the best 
compromise to add the feature.

Regards

François



--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to