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
Last revisionBoth sides next revision
rfc:dbc2 [2015/02/10 12:52] krakjoerfc:dbc2 [2017/09/22 13:28] – external edit 127.0.0.1
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: 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 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====
Line 108: Line 111:
 Contracts are constant, this has the following implications: Contracts are constant, this has the following implications:
  
-  * a derived class must satisfy invariants contracts of it's parent+  * 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.   * a derived class overriding a method must satisfy the pre and post condition contracts of it's prototype.
  
Line 147: 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**
rfc/dbc2.txt · Last modified: 2018/03/01 23:19 by carusogabriel