PHP Classes
elePHPant
Icontem

File: account_example.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Joe Chrzanowski  >  DCI  >  account_example.php  >  Download  
File: account_example.php
Role: Example script
Content type: text/plain
Description: An example using DCI paradigm to illustrate a money transfer
Class: DCI
Implementation of DCI paradigm to separate logic
Author: By
Last change:
Date: 4 years ago
Size: 2,843 bytes
 

Contents

Class file image Download
<?php
   
// require the files needed for this test
   
require_once ("../DCIObject.php");
    require_once (
"../DCIException.php");
    require_once (
"../Context.php");
       
    interface
rMoneySource {
        function
Withdraw($amount);
    }
    interface
rMoneySink {
        function
Deposit($amount);
    }
   
    class
rMoneySourceActions {
        static function
TransferFunds(rMoneySource $self, rMoneySink $dest, $amount) {
            if (
$self->Withdraw($amount))
               
$dest->Deposit($amount);
        }
    }
   
   
/**
    * A base Account object. It's a dumb model, capable only
    * of increasing and decreasing its balance. We can use
    * roles to make different Account objects interact with each
    * other.
    *
    * Contexts are "use cases". They call role methods to implement interactivity
    * Role methods are "algorithms". They call various object methods to perform a task
    */
   
class Account
   
extends DCIObject
   
implements rMoneySource, rMoneySink {
        protected
$balance;
       
        function
__construct($initial_balance) {
           
parent::__construct();
           
           
$this->balance = $initial_balance;
        }
        function
Withdraw($amount) {
            if (
$amount <= $this->balance) {
               
$this->balance -= $amount;
                return
$amount;
            }
            else
                throw new
DCIException("Insufficient Funds","Tried to withdraw $amount<br />{$this->balance} available.");
        }
        function
Deposit($amount) {
           
$this->balance += $amount;
        }
        function
GetBalance() { return $this->balance; }
    }
    class
FeeAccount
   
extends Account {
        function
Deposit($amount) {
           
$this->balance += ($amount * .9);
        }
    }
   
   
/**
    * The example code-- implemented as a context
    */
   
class TransferCtx extends Context {
        function
Execute(rMoneySource $source, rMoneySink $sink, $amount) {
           
$source->TransferFunds($sink,$amount);
        }
    }
   
   
/**
    * Run the context and display the change in values
    */
   
$checking = new Account(1000);
   
$savings = new FeeAccount(500);
   
    echo
"<h3>Initialization Test:</h3>";
    echo
"Checking Account: $" . $checking->GetBalance() . "<br />";
    echo
"Savings Account: $" . $savings->GetBalance() . "<br /><br />";
   
   
$tm_ctx = new TransferCtx();
   
$tm_ctx->Execute($checking, $savings, 500);
   
    echo
"<h3>Transaction Test:</h3>";
    echo
"Checking Account: $" . $checking->GetBalance() . "<br />";
    echo
"Savings Account: $" . $savings->GetBalance() . "<br /><br />";
   
    echo
"<h3>Insufficient Funds Exception Test</h3>";
    echo
"Insufficient Funds Test:<br />";
   
$tm_ctx->Execute($checking, $savings, 1000);
?>