我正在观看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() 函数的对象必须是实现"订阅"接口的该类的实例