Interfaces and Traits
Function Contract
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
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";
$value ← draft
20$value→ draft = "draft"; //@value="ready", "sent"21$label = makeLabel(new BracketLabeler(), $valuedraft);function makeLabel(Labeler $labeler, string $value): string
15function makeLabel(Labeler $labelerBracketLabeler, string $valuedraft): string16{17 return $labelerBracketLabeler->label($valuedraft);18}public function label(string $value): string
8{9 public function label(string $valuedraft): string10 {11 return "[" . $valuedraft . "]";12 }$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]
$value ← ready
20$value→ ready = "ready";21$label = makeLabel(new BracketLabeler(), $valueready);function makeLabel(Labeler $labeler, string $value): string
15function makeLabel(Labeler $labelerBracketLabeler, string $valueready): string16{17 return $labelerBracketLabeler->label($valueready);18}public function label(string $value): string
8{9 public function label(string $valueready): string10 {11 return "[" . $valueready . "]";12 }$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]
$value ← sent
20$value→ sent = "sent";21$label = makeLabel(new BracketLabeler(), $valuesent);function makeLabel(Labeler $labeler, string $value): string
15function makeLabel(Labeler $labelerBracketLabeler, string $valuesent): string16{17 return $labelerBracketLabeler->label($valuesent);18}public function label(string $value): string
8{9 public function label(string $valuesent): string10 {11 return "[" . $valuesent . "]";12 }$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]