Got it, but currently we don't declare internal classes/interfaces in PHP. We do it with internal C API, of course we may extend it to support contracts, but it looks too complex for C. It's easier to make all necessary validation directly in C code. I don't think we should propose something related now.
Thanks. Dmitry. On Wed, Feb 11, 2015 at 6:01 AM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote: > Hi Dmitry and Joe, > > On Wed, Feb 11, 2015 at 6:29 AM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote: > >> On Tue, Feb 10, 2015 at 8:53 PM, Dmitry Stogov <dmi...@zend.com> wrote: >> >>> You are welcome to edit https://wiki.php.net/rfc/dbc2 >>> It looks like we have similar views, so just make it better in a way you >>> think. >>> >> >> Looks good to me. It's much better than original. Thank you folks. >> We have related issue like how internal module incorporate with DbC. >> However >> these could be future issues. >> > > I would like explain one of the reason why I bring up internal module. > > http://php.net/manual/en/class.sessionhandlerinterface.php > > Session has internal interface definitions like > > SessionHandlerInterface { > /* Methods */ > abstract public bool close ( void ) > abstract public bool destroy ( string $session_id ) > abstract public bool gc ( string $maxlifetime ) > abstract public bool open ( string $save_path , string $name ) > abstract public string read ( string $session_id ) > abstract public bool write ( string $session_id , string $session_data ) > } > > but it should be like follows to be precise. > > SessionHandlerInterface { > /* Methods */ > abstract public bool close ( void ) > return($ret, is_bool($ret)); > > abstract public bool destroy ( string $session_id ) > require(strlen($session_id) > 0) > return($ret, is_bool($ret)); > > abstract public bool gc ( string $maxlifetime ) > require($maxlifetime >= 0) > return($ret, is_int($ret) && $ret >= -1); > > abstract public bool open ( string $save_path , string $name ) > require(is_string($save_path)) > require(is_string($name)); > return($ret, is_bool($ret)); > > abstract public string read ( string $session_id ) > require(strlen($session_id) > 0) > return($ret, is_bool($ret) || is_string($ret)); > > abstract public bool write ( string $session_id , string $session_data ) > require(is_string($session_id) && strlen($session_id) > 0) > require(is_string($session_data)) > return($ret, is_bool($ret)); > } > > This definition is more user friendly. There were too many user save > handlers > that do not return proper values because of current interface limitation. > > Scalar type and return type hint helps, but it does not cover > > return($ret, is_int($ret) && $ret >= -1); > > for example. > > If you think this is easy to implement and should be in the RFC, I would > appreciated it > and use it to raise assertion errors just like user class/interface. > > BTW, these restrictions are coded as error in current session module and > should > be checked by the module always. It's not mandatory for the RFC, but just > a missing piece. > > Regards, > > -- > Yasuo Ohgaki > yohg...@ohgaki.net > >