Контекстное связывание работает не с именами переменных, а с типами.Он используется для предоставления различных реализаций интерфейсов к потребляющим классам или функциям, в зависимости от контекста.Фактически, вы можете фактически прочитать вызовы метода, и он делает именно то, что вы ожидаете.Чтобы уточнить это, я возьму пример документации и немного его адаптирую:
$this->app->when(Worker::class)
->needs(Money::class)
->give(function () {
return new Dollar();
});
$this->app->when(Boss::class)
->needs(Money::class)
->give(function () {
return new Cheque();
});
В этом примере Money
- это интерфейс, а Cents
и Cheque
- реализации.интерфейса.Пример буквально означает, что если вы напечатаете подсказку Money
в классе Worker
, он будет преобразован в экземпляр Dollar
, а в Boss
- в Cheque
.Чтобы проиллюстрировать, здесь реализации и результаты:
interface Money
{
public function getAmount();
}
class Dollar implements Money
{
public function getAmount()
{
return 1;
}
}
class Cheque implements Money
{
public function getAmount()
{
return 100000;
}
}
А теперь мы набираем подсказку интерфейса Money
, чтобы увидеть, что мы получим:
class Worker
{
public function __construct(Money $money)
{
echo $money->getAmount(); // prints '1'
}
}
class Boss
{
public function __construct(Money $money)
{
echo $money->getAmount(); // prints '100000'
}
}