Interfaces and Traits
Trait Override
A class method can call a renamed trait method and add class-specific behavior.
adapted reuse
Trait aliases let a class keep the shared method available while customizing its public method.
Trait Override
trait_override.php
Replay: real traced execution (multi-file project)
<?php
trait Greets
{
public function greet(string $name): string
{
return "hello " . $name;
}
}
class LoudGreeter
{
use Greets {
greet as baseGreet;
}
public function greet(string $name): string
{
return strtoupper($this->baseGreet($name));
}
}
$name = "Ada";
$greeter = new LoudGreeter();
$message = $greeter->greet($name);
echo "name=" . $name . "\n";
echo "message=" . $message . "\n";
<?php
trait Greets
{
public function greet(string $name): string
{
return "hello " . $name;
}
}
class LoudGreeter
{
use Greets {
greet as baseGreet;
}
public function greet(string $name): string
{
return strtoupper($this->baseGreet($name));
}
}
$name = "Grace";
$greeter = new LoudGreeter();
$message = $greeter->greet($name);
echo "name=" . $name . "\n";
echo "message=" . $message . "\n";
<?php
trait Greets
{
public function greet(string $name): string
{
return "hello " . $name;
}
}
class LoudGreeter
{
use Greets {
greet as baseGreet;
}
public function greet(string $name): string
{
return strtoupper($this->baseGreet($name));
}
}
$name = "Rasmus";
$greeter = new LoudGreeter();
$message = $greeter->greet($name);
echo "name=" . $name . "\n";
echo "message=" . $message . "\n";
$name ← Ada, $greeter ← LoudGreeter
22$name→ Ada = "Ada"; //@name="Grace", "Rasmus"23$greeter→ LoudGreeter = new LoudGreeter();24$message = $greeterLoudGreeter->greet($nameAda);public function greet(string $name): string
16public function greet(string $nameAda): string17{18 return strtoupper($thisLoudGreeter->baseGreet($nameAda));19}public function greet(string $name): string
3{4 public function greet(string $nameAda): string5 {6 return "hello " . $nameAda;7 }$message ← HELLO ADA
23$greeter = new LoudGreeter();24$message→ HELLO ADA = $greeterLoudGreeter->greet($nameAda);2526echo "name=" . $nameAda . "\n";27echo "message=" . $messageHELLO ADA . "\n";outputname=Ada message=HELLO ADA
$name ← Grace, $greeter ← LoudGreeter
22$name→ Grace = "Grace";23$greeter→ LoudGreeter = new LoudGreeter();24$message = $greeterLoudGreeter->greet($nameGrace);public function greet(string $name): string
16public function greet(string $nameGrace): string17{18 return strtoupper($thisLoudGreeter->baseGreet($nameGrace));19}public function greet(string $name): string
3{4 public function greet(string $nameGrace): string5 {6 return "hello " . $nameGrace;7 }$message ← HELLO GRACE
23$greeter = new LoudGreeter();24$message→ HELLO GRACE = $greeterLoudGreeter->greet($nameGrace);2526echo "name=" . $nameGrace . "\n";27echo "message=" . $messageHELLO GRACE . "\n";outputname=Grace message=HELLO GRACE
$name ← Rasmus, $greeter ← LoudGreeter
22$name→ Rasmus = "Rasmus";23$greeter→ LoudGreeter = new LoudGreeter();24$message = $greeterLoudGreeter->greet($nameRasmus);public function greet(string $name): string
16public function greet(string $nameRasmus): string17{18 return strtoupper($thisLoudGreeter->baseGreet($nameRasmus));19}public function greet(string $name): string
3{4 public function greet(string $nameRasmus): string5 {6 return "hello " . $nameRasmus;7 }$message ← HELLO RASMUS
23$greeter = new LoudGreeter();24$message→ HELLO RASMUS = $greeterLoudGreeter->greet($nameRasmus);2526echo "name=" . $nameRasmus . "\n";27echo "message=" . $messageHELLO RASMUS . "\n";outputname=Rasmus message=HELLO RASMUS