PHP Interfaces Quickstart

PHP interfaces are still quite new to most. Below is a simple demonstration of their usefulness. I think I’d seen this within one of the many fantastic laravel books.

<?php  
interface BillerInterface {  
    public function bill(array $user, $amount);
}
interface BillingNotifierInterface {  
    public function notify(array $user, $amount);
}

class NotifyByEmail implements BillingNotifierInterface {
public function notify(array $user, $amount)
{
echo “Send email for “.$user[“name”].” of $amount”.PHP_EOL;
}
}

class NotifyByMessage implements BillingNotifierInterface {
public function notify(array $user, $amount)
{
echo “Display message for “.$user[“name”].” of $amount”.PHP_EOL;
}
}

class NotifyBySMS implements BillingNotifierInterface {
public function notify(array $user, $amount)
{
echo “Send SMS for “.$user[“name”].” of $amount”.PHP_EOL;
}
}

class StripeBiller implements BillerInterface {
public function __construct(BillingNotifierInterface $notifier)
{
$this->notifier = $notifier;
}

public function bill(array $user, $amount)
{
    // Bill the user via Stripe...
    echo "Bill via Stripe".PHP_EOL;
    $this-&gt;notifier-&gt;notify($user, $amount);
}

}

class PaypalBiller implements BillerInterface {
public function __construct(BillingNotifierInterface $notifier)
{
$this->notifier = $notifier;
}

public function bill(array $user, $amount)
{
    echo "Bill via Paypal".PHP_EOL;
    $this-&gt;notifier-&gt;notify($user, $amount);
}

}

class EPDQBiller implements BillerInterface {
public function __construct(BillingNotifierInterface $notifier)
{
$this->notifier = $notifier;
}

public function bill(array $user, $amount)
{
    echo "Bill via ePDQ".PHP_EOL;
    $this-&gt;notifier-&gt;notify($user, $amount);
}

}

$newBill = new StripeBiller(new NotifyBySMS);
$newBill->bill(
array(
“name” => “Scott Wilcox”
),
“123.89”
);
$newBill = new PaypalBiller(new NotifyByMessage);
$newBill->bill(
array(
“name” => “Scott Wilcox”
),
“123.89”
);
$newBill = new EPDQBiller(new NotifyByEmail);
$newBill->bill(
array(
“name” => “Scott Wilcox”
),
“123.89”
);