1

在阅读有关按合同设计的内容时,我遇到了 php-deal。现在,它的演示代码如下所示:

/** @var Composer\Autoload\ClassLoader $loader */
$loader = include __DIR__.'/../vendor/autoload.php';
$loader->add('Demo', __DIR__);

include_once __DIR__.'/aspect_bootstrap.php';

$account = new Demo\Account();
$account->deposit(100);
echo $account->getBalance();

该类Demo\Account如下所示:

class Account implements AccountContract
{
    /**
     * Current balance
     *
     * @var float
     */
    protected $balance = 0.0;


    /**
     * Deposits fixed amount of money to the account
     *
     * @param float $amount
     *
     * @Contract\Verify("$amount>0 && is_numeric($amount)")
     * @Contract\Ensure("$this->balance == $__old->balance+$amount")
     */
    public function deposit($amount)
    {
        $this->balance += $amount;
    }


    /**
     * Returns current balance
     *
     * @Contract\Ensure("$__result == $this->balance")
     * @return float
     */
    public function getBalance()
    {
        return $this->balance;
    }
}

注释是重要的部分,因为它们验证并确保注释中的合同得到执行。

像这样调用类:

$account = new Demo\Account();
$account->deposit(100);
echo $account->getBalance();

按预期工作。然而,像这样调用类:

$account = new Demo\Account();
$account->deposit("1notanumber");
echo $account->getBalance();

引发关于合同未执行的异常。

但是,如果我这样调用类:

$account = new Demo\Account();
$account->deposit("1notanumber");
echo $account->getBalance();

include_once __DIR__.'/aspect_bootstrap.php';

$account = new Demo\Account();
$account->deposit("1notanumber");
echo $account->getBalance();

合同执行停止工作。我的问题是,文件如何aspect_bootstrap.php覆盖预定义的 PHP 类以允许解析和执行注释,以及如何在不调用整个 Go AOP 框架的情况下做到这一点?

Github repo for PHP-Deal with demo

4

0 回答 0