A function can ask for an interface and accept any object that implements it.

Function Contract

function_contract.php
<?php
interface Labeler
{
    public function label(string $value): string;
}

class BracketLabeler implements Labeler
{
    public function label(string $value): string
    {
        return "[" . $value . "]";
    }
}

function makeLabel(Labeler $labeler, string $value): string
{
    return $labeler->label($value);
}

$value = ;
$label = makeLabel(new BracketLabeler(), $value);

echo "value=" . $value . "\n";
echo "label=" . $label . "\n";
<?php
interface Labeler
{
    public function label(string $value): string;
}

class BracketLabeler implements Labeler
{
    public function label(string $value): string
    {
        return "[" . $value . "]";
    }
}

function makeLabel(Labeler $labeler, string $value): string
{
    return $labeler->label($value);
}

$value = ;
$label = makeLabel(new BracketLabeler(), $value);

echo "value=" . $value . "\n";
echo "label=" . $label . "\n";
<?php
interface Labeler
{
    public function label(string $value): string;
}

class BracketLabeler implements Labeler
{
    public function label(string $value): string
    {
        return "[" . $value . "]";
    }
}

function makeLabel(Labeler $labeler, string $value): string
{
    return $labeler->label($value);
}

$value = ;
$label = makeLabel(new BracketLabeler(), $value);

echo "value=" . $value . "\n";
echo "label=" . $label . "\n";
interface parameter Interface parameters make the function depend on behavior, not a concrete class.