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
Next revisionBoth sides next revision
rfc:dbc2 [2015/02/10 12:25] krakjoerfc:dbc2 [2015/02/14 23:14] – fixed typo during review marcio
Line 41: Line 41:
 ===== 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 70:
 ===== 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 82:
  }  }
  
- requre($this->sum > 0, "overflow detected");+ require($this->sum > 0, "overflow detected");
 } }
 </code> </code>
Line 102: Line 102:
 </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 147:
   * 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 163:
   * <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 238:
 ===== 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.txt · Last modified: 2018/03/01 23:19 by carusogabriel