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


passing interface as function parameter (PHP)?

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

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

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

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

我不明白他在这里做什么。他是否将接口"订阅"作为函数参数传递..?在以前所有关于接口的教程中,我从未见过这一点。

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

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

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

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

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


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();
}

在此方法中,您正在尝试进行方法注入
方法注入意味着将依赖关系(实例/引用/对象等)传递到方法中

in Singup(订阅$subscription) 曼托德


订阅是"类型提示"
确保将传递给 signUp() 函数的对象必须是实现"订阅"接口的该类的实例