rfc:dbc2

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rfc:dbc2 [2015/02/10 12:25] krakjoerfc:dbc2 [2018/03/01 23:19] (current) – Typo "Under Discussion" carusogabriel
Line 3: Line 3:
   * Date: 2015-02-10   * Date: 2015-02-10
   * Author: Yasuo Ohgaki <yohgaki@ohgaki.net>, Dmitry Stogov <dmitry@zend.com>, Joe Watkins <pthreads@pthreads.org>   * Author: Yasuo Ohgaki <yohgaki@ohgaki.net>, Dmitry Stogov <dmitry@zend.com>, Joe Watkins <pthreads@pthreads.org>
-  * Status: Draft+  * Status: Under Discussion
   * First Published at: http://wiki.php.net/rfc/dbc2   * First Published at: http://wiki.php.net/rfc/dbc2
  
 ===== Important Note ===== ===== Important Note =====
 +
 +This RFC is part of "Design by Contract Introduction" RFC
 +  * https://wiki.php.net/rfc/introduce_design_by_contract
  
 This RFC is an alternative approach to "Native DbC support" RFC. This RFC is an alternative approach to "Native DbC support" RFC.
-http://wiki.php.net/rfc/dbc+  * http://wiki.php.net/rfc/dbc
  
 Contracts can be defined without modification to the language, however, the D documentation calls the resulting implementation "clumsy and inconsistent". Contracts can be defined without modification to the language, however, the D documentation calls the resulting implementation "clumsy and inconsistent".
Line 41: Line 44:
 ===== Pre and Post Condition ===== ===== Pre and Post Condition =====
  
-These contracts should be defined after the function declaration, but before the function body. +These contracts should be defined after the function declaration, but before the function body.
  
-Multiple precondition and postcondition contracts may be used. The expressions are just a regular PHP expressions. They have access to input arguments (through their names) or return value (by reserving it'name in the contract). Pre and post-conditions can't be defined for abstract methods and methods defined in interfaces.+Multiple precondition and postcondition contracts may be used. The expressions are just a regular PHP expressions. They are evaluated in the function scope, and can access arguments and other scope variables, and return value (via a reserved name). Pre and post-conditions can't be defined for abstract methods and methods defined in interfaces.
  
 <code> <code>
Line 70: Line 73:
 ===== Invariant ===== ===== Invariant =====
  
-Invariant contracts are declared using **require** inside class body. Multiple contracts may be used. They may access object or static properties through **$this** and **self**. Invariant contracts may be used for classes, abstract classes and traits, but not for interfaces.+Invariant contracts are declared using **require** inside class body. Multiple invariant contracts may be used. They may access object or static properties through **$this** and **self**. Invariant contracts may be used for classes, abstract classes and traits, but not for interfaces.
  
 <code> <code>
Line 82: Line 85:
  }  }
  
- requre($this->sum > 0, "overflow detected");+ require($this->sum > 0, "overflow detected");
 } }
 </code> </code>
Line 102: Line 105:
 </code> </code>
  
-**Invariants are not evaluated when object properties are changed from outside the class scope.**+**Invariant contracts are not evaluated when object properties are changed from outside the class scope.**
  
 ====Contracts Inheritance Rules==== ====Contracts Inheritance Rules====
-**TODO**+ 
 +Contracts are constant, this has the following implications: 
 + 
 +  a derived class must satisfy invariant contracts of it's parent 
 +  a derived class overriding a method must satisfy the pre and post condition contracts of it's prototype. 
 + 
 +Thus, given the following code: 
 + 
 +<code> 
 +class Child { 
 +    require ($this->age < 18); 
 +     
 +    public function someMethod($input)  
 +        require(somethingAbout($input)) { 
 +        /... *
 +    } 
 + 
 +    /* ... */ 
 +
 + 
 +class Monster extends Child { 
 +    require ($this->odour == OBNOXIOUS); 
 + 
 +    public function someMethod($input)  
 +        require(somethingElseAbout($input)) { 
 +        /* ... */ 
 +    } 
 + 
 +    /* ... */ 
 +
 +</code> 
 + 
 +//Monster// must not break **any** contract in //Child//.
  
 ====Execution Control==== ====Execution Control====
Line 115: Line 150:
   * dbc=zero_cost - don't generate code for contracts. This may be set only in php.ini and can't be changed through ini_set().   * dbc=zero_cost - don't generate code for contracts. This may be set only in php.ini and can't be changed through ini_set().
  
-  The default value if "off".+  The default value is "off".
  
-===Contracts Evaluation Order===+===Contracts Execution Order===
  
 If "dbc" is set to "on", the order of contracts validation is the following: If "dbc" is set to "on", the order of contracts validation is the following:
  
-  - all require() contracts (preconditions) defined for this methods (in defined order+  - all require() contracts (precondition) defined for this function (and prototype where applicable
-  - all require() contracts (invariantsdefined for this class (in defined oredrer)+  - all require() contracts (invariant) for this class and parents
   - method body   - method body
-  - all require() contracts (invariantsdefined for this class (in defined oredrer) +  - all require() contracts (invariant) for this class and parents 
-  - all return() contracts (postconditions) defined for this methods (in defined order)+  - all return() contracts (postcondition) defined for this function (and prototype where applicable)
  
 **Invariant and Special Methods** **Invariant and Special Methods**
Line 131: Line 166:
   * <nowiki>__constructs()/__wakeup()/__set_state()</nowiki> will NOT execute invariant before method body.   * <nowiki>__constructs()/__wakeup()/__set_state()</nowiki> will NOT execute invariant before method body.
   * <nowiki>__destruct()/__sleep()</nowiki> will NOT execute invariant after method body.   * <nowiki>__destruct()/__sleep()</nowiki> will NOT execute invariant after method body.
- 
-**Class Inheritance** 
- 
-  * When parent class methods are called, DbC conditions are executed 
-  * Special methods execution exception is the same 
  
 **Static Call** **Static Call**
  
-  * Only pre/post contracts are executed +  * Only pre and post conditions are executed.
- +
-**Interface** +
- +
-  * Cannot define DbC contracts.+
  
 ===== Backward Incompatible Changes ===== ===== Backward Incompatible Changes =====
Line 215: Line 241:
 ===== Rejected Features ===== ===== Rejected Features =====
 Keep this updated with features that were discussed on the mail lists. Keep this updated with features that were discussed on the mail lists.
- 
rfc/dbc2.1423571125.txt.gz · Last modified: 2017/09/22 13:28 (external edit)