Re: Design by Contract
| From: | Alexander Lisachenko | Date: | Thu, 05 Feb 2015 12:42:59 +0000 |
| Subject: | Re: Design by Contract | ||
| References: | 1 2 3 4 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-81919@lists.php.net to get a copy of this message | ||
2015-02-05 15:32 GMT+03:00 Dmitry Stogov <dmitry@zend.com>:
> Hi Alexander,
>
> Defining contracts through doc-comments is also possible, but this way is
> not native.
> On the other hand, if you already have this implemented, we may just reuse
> it.
>
Thanks, Dmitry! This would be a really nice feature on engine-level.
Ideally, for PHP7-8, I would like to see a hook system from compile-level
to userland, to define a language extension. This feature is highly
required for custom DSLs and much more. DbC technique can be also
implemented as parse-time weaver. E.g. we define a parser-extension:
register_parser_extension(ContractExtension::class);
this class will receive an AST of PHP file and check interesting nodes.
This node can be annotation or something else:
[Contract::Invariant => $this->value > 0]
class Test {
public $value = 100;
public function foo($newValue) {
$this->value = $newValue;
}
}
and parser extension change the compiled source code by inserting this
check into methods:
[Contract::Invariant => $this->value > 0]
class Test {
public $value = 100;
public function foo($newValue) {
$this->value = $newValue;
assert($this->value > 0); // Inserted by parser extension (via
opcodes)
}
}
Is it possible to do this?