我正在观看关于编码规则的Jeffs Laracast教程之一。
function signUp($subscription)
{
if ($subscription == 'monthly')
{
$this->createMonthlySubscription();
}
elseif ($subscription == 'forever')
{
$this->createForeverSubscription();
}
}
他想在这里使用多态和接口。他将上面的代码更改为:
function signUp(Subscription $subscription)
{
$subscription->create();
}
我不明白他在这里做了什么。他是否通过界面"订阅"作为函数参数..?我以前从未在所有关于接口的教程中看到过这个。
答案 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 '接口