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

interface parameter Interface parameters make the function depend on behavior, not a concrete class.

Function Contract

value
function_contract.php
Replay: real traced execution (multi-file project)
<?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 = "draft";
$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 = "ready";
$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 = "sent";
$label = makeLabel(new BracketLabeler(), $value);

echo "value=" . $value . "\n";
echo "label=" . $label . "\n";
  1. $value ← draft

    20$value→ draft = "draft"; //@value="ready", "sent"21$label = makeLabel(new BracketLabeler(), $valuedraft);
  2. function makeLabel(Labeler $labeler, string $value): string

    15function makeLabel(Labeler $labelerBracketLabeler, string $valuedraft): string16{17    return $labelerBracketLabeler->label($valuedraft);18}
  3. public function label(string $value): string

    8{9    public function label(string $valuedraft): string10    {11        return "[" . $valuedraft . "]";12    }
  4. $label ← [draft]

    20$value = "draft"; //@value="ready", "sent"21$label→ [draft] = makeLabel(new BracketLabeler(), $valuedraft);2223echo "value=" . $valuedraft . "\n";24echo "label=" . $label[draft] . "\n";
    outputvalue=draft
    label=[draft]
  1. $value ← ready

    20$value→ ready = "ready";21$label = makeLabel(new BracketLabeler(), $valueready);
  2. function makeLabel(Labeler $labeler, string $value): string

    15function makeLabel(Labeler $labelerBracketLabeler, string $valueready): string16{17    return $labelerBracketLabeler->label($valueready);18}
  3. public function label(string $value): string

    8{9    public function label(string $valueready): string10    {11        return "[" . $valueready . "]";12    }
  4. $label ← [ready]

    20$value = "ready";21$label→ [ready] = makeLabel(new BracketLabeler(), $valueready);2223echo "value=" . $valueready . "\n";24echo "label=" . $label[ready] . "\n";
    outputvalue=ready
    label=[ready]
  1. $value ← sent

    20$value→ sent = "sent";21$label = makeLabel(new BracketLabeler(), $valuesent);
  2. function makeLabel(Labeler $labeler, string $value): string

    15function makeLabel(Labeler $labelerBracketLabeler, string $valuesent): string16{17    return $labelerBracketLabeler->label($valuesent);18}
  3. public function label(string $value): string

    8{9    public function label(string $valuesent): string10    {11        return "[" . $valuesent . "]";12    }
  4. $label ← [sent]

    20$value = "sent";21$label→ [sent] = makeLabel(new BracketLabeler(), $valuesent);2223echo "value=" . $valuesent . "\n";24echo "label=" . $label[sent] . "\n";
    outputvalue=sent
    label=[sent]