传递接口作为函数参数(PHP)?

时间:2016-04-28 11:15:47

标签: php polymorphism

我正在观看关于编码规则的Jeffs Laracast教程之一。

function signUp($subscription) 
{
    if ($subscription == 'monthly')
    {
        $this->createMonthlySubscription();
    }
    elseif ($subscription == 'forever')
    {
        $this->createForeverSubscription();
    }
 }

他想在这里使用多态和接口。他将上面的代码更改为:

function signUp(Subscription $subscription)
{
    $subscription->create();
}

我不明白他在这里做了什么。他是否通过界面"订阅"作为函数参数..?我以前从未在所有关于接口的教程中看到过这个。

2 个答案:

答案 0 :(得分:7)

function signUp(Subscription $subscription)
{
    $subscription->create();
}

此方法需要一个名为$subscription的参数。此参数必须是实现 null接口的具体对象(或Subscription)。

这是通过参数之前所谓的“类型提示”(http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration)来完成的。

Subscription不需要是这里的接口 - 它也可以是一个类,给定的参数必须是Subscription的实例或任何派生类型。

答案 1 :(得分:1)

这是根据您给定情况的详细说明,我希望如此后您将正确理解此概念


Interface Subscription{
    public function create();
}

class MonthlySubscription implements Subscription{

    public function create(){
        print_r("this is monthly subscription create method");
    }

}

class ForeverSubscription implements Subscription{

public function create(){
        print_r("this is yearly subscription create method");
    }   

}


class user {

public function signUp(Subscription $subscription){

    $subscription->create();

}

public function getSubcriptionType($type){

if($type=='forever'){

    return new ForeverSubscription;

}

    return new MonthlySubscription;

}


}

$user=new User();

$subscription=$user->getSubcriptionType('forever');

$user->signUP($subscription);


public function signUp(Subscription $subscription){
    $subscription->create();
}

在这种方法中,您尝试进行 方法注入
方法注入 表示 ,将依赖项(实例/引用/对象等)传递给方法

  

在Singup(订购$ subscription)模式中


Subscription 是“ 类型提示
这样可以确保将传递给signUp()函数的对象必须是实现了' Subscription '接口

的该类的实例。