Hi Dmitry and Joe, On Mon, Feb 9, 2015 at 8:27 PM, Dmitry Stogov <dmi...@zend.com> wrote:
> yes. this may work. > probably better to put it after extends and implements. > > > Dmitry. > > On Mon, Feb 9, 2015 at 2:19 PM, Joe Watkins <pthre...@pthreads.org> wrote: > >> Could this be described as a requirement of the class ? >> >> class Mine >> require(invariant-expr) >> extends Something >> implements Someface { >> >> public function method($param) : return >> require(input-expr), >> return(output-expr) { >> >> } >> } >> >> To avoid invariant keyword maybe. >> > This would work. If users have adopted DbC in some way, 'invariant' may be used already. I see two issues. Interface works, but most classes are class without interfaces. Then users have to repeat require()/return() many times to check class state or have to use interface for DbC. Since compiler does not know a method() is for DbC invariant, it will be compiled and exists in production execution. Use of interface: - no additional keyword (pros) - requires interface for DbC, most classes does not require interface (cons) - if interface is not used, user has to repeat invariant conditions over and over (cons) - requires to define method that should not exist in production (cons) New keyword: - does not require interface for efficient definition (pros). - new keyword (cons) It seems we are better to choose proper keyword for 'invariant'. 'invariant' is not common, so 'invariant' may be good enough choice. Does anyone use 'invariant' as function/method/class/constant names? If there is better name, suggestion is appreciated. On place closure call like javascript is not supported in PHP, but function works with assert. <?php function foo() { return FALSE; } assert(foo()); ?> PHP Warning: assert(): Assertion failed in - on line 3 This wouldn't be changed for require()/return()/invariant()? We need a switch to change development/production. I'll use "dbc=On/Off" for now. If you have any better idea, please let me know. (dbc will be INI_SYSTEM) For CLI, there will be no command line switch for dbc. It executes script production mode by default. If user needs development mode php -d dbc=1 script.php should be used. And finally, are we going to allow custom assertion error message? e.g. require($a > 0, 'Parameter $a must be positive number'); Since this contract is definition like "implements"/"extends", we may not allow custom error message. I'll write the RFC not to allow custom error messages unless you dislike it. I think we have enough consensus/information to start writing the RFC. If I have any concern, I'll ask here. Regards, P.S. If anyone finds issues with DbC as class definition, please let me know. -- Yasuo Ohgaki yohg...@ohgaki.net