使用抽象类来满足php中的接口

时间:2016-11-03 03:35:47

标签: php class interface abstract

我想使用Amazon SNS在我的应用程序中发送短信。我唯一担心的是,如果我决定将Amazon SNS换成其他提供商,会发生什么?

我已经提出了以下解决方案,但我不确定这是最佳做法还是将来会产生任何影响。

<?php

interface SMS {
    public function sendSMS($from, $to);
}

abstract class AmazonSNS {
    public function sendSMS($from, $to) {
        echo 'Message sent';
    }
}

class Notification extends AmazonSNS implements SMS {

}

$notification = new Notification;
$notification->sendSMS('xxxx', 'xxxx');

我的思维过程是我的应用程序只关心通知类,该类将强制我使用的任何抽象类(服务提供者)来实现这些方法接口所需的(我也可以使用电子邮件界面)。使用抽象类也会阻止它直接实例化,这将是不希望的行为。

1 个答案:

答案 0 :(得分:1)

对我而言,最好使用

<?php

    interface Notification {
        public function notify($from, $to);
    }

    class AmazonSNSSmsNotification implements Notification {
        public function notify($from, $to) {
             //send notification using SMS
        }
    }

    class OtherProviderSmsNotification implements Notification {
        public function notify($from, $to) {
             //send notification using SMS from other provider
        }
    }

    class EmailNotification implements Notification {
        public function notify($from, $to) {
             //send notification using email
        }
    }

然后你可以轻松交换实现

function sendNotification(Notification $notifObj, $from, $to) {
    $notifObj.notify($from, $to);
}

sendNotification(new AmazonSNSSmsNotification(), $from, $to);
sendNotification(new OtherProviderSmsNotification(), $from, $to);