Any class with __toString satisfies Stringable automatically in 8.0, and declaring it explicitly is still the better choice.
final class Sku
{
public function __toString(): string { return $this->value; }
}
$sku instanceof Stringable; // true, without implements
// but a parameter typed string|Stringable accepts both,
// and the explicit declaration is what a reader sees:
final class Sku implements Stringable
{
public function __toString(): string { return $this->value; }
}
The automatic satisfaction exists so the type is useful against code written before 8.0, which is most code. Declaring it anyway documents intent and, more usefully, means removing __toString becomes a compile error rather than a silent change in what the class satisfies. The string|Stringable parameter type is the reason any of this matters — it is what lets a function accept a value object without every caller casting.