2016-04-28 4 views
3

Я смотрю один из учебников Jeffs Laracast о правилах кодирования.прохождение интерфейса как функциональный параметр (PHP)?

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

Он хочет использовать здесь полиморфизм и интерфейсы. Он изменяет приведенный выше код на:

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

Я не понимаю, что он здесь делает. Проводит ли он интерфейс «Подписка» как параметр функции ..? Я никогда не видел этого во всех предыдущих руководствах об интерфейсах.

+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, либо любым производным типом.

Смежные вопросы