2016-04-28 142 views
3

我正在观看Jeffs Laracast教程中关于编码规则的其中之一。将接口作为函数参数(PHP)传递?

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

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

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

我不明白他在这里做什么。他是否将界面“Subscription”作为函数参数传递给..?我从未在以前的所有关于接口的教程中看到过这一点。

+1

你确定'$ subscription'是一个接口而不是一个类吗? – Daan

+6

'$ subscription'应该是一个实现'Subscription'接口的类的对象。所以,你不需要指定某个类作为函数的参数 – RomanPerekhrest

+1

这就是所谓的类型提示。看看这里:http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration – colburton

回答

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

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

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

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