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

name
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";
  1. $name ← Ada, $greeter ← LoudGreeter

    22$name→ Ada = "Ada"; //@name="Grace", "Rasmus"23$greeter→ LoudGreeter = new LoudGreeter();24$message = $greeterLoudGreeter->greet($nameAda);
  2. public function greet(string $name): string

    16public function greet(string $nameAda): string17{18    return strtoupper($thisLoudGreeter->baseGreet($nameAda));19}
  3. public function greet(string $name): string

    3{4    public function greet(string $nameAda): string5    {6        return "hello " . $nameAda;7    }
  4. $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
  1. $name ← Grace, $greeter ← LoudGreeter

    22$name→ Grace = "Grace";23$greeter→ LoudGreeter = new LoudGreeter();24$message = $greeterLoudGreeter->greet($nameGrace);
  2. public function greet(string $name): string

    16public function greet(string $nameGrace): string17{18    return strtoupper($thisLoudGreeter->baseGreet($nameGrace));19}
  3. public function greet(string $name): string

    3{4    public function greet(string $nameGrace): string5    {6        return "hello " . $nameGrace;7    }
  4. $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
  1. $name ← Rasmus, $greeter ← LoudGreeter

    22$name→ Rasmus = "Rasmus";23$greeter→ LoudGreeter = new LoudGreeter();24$message = $greeterLoudGreeter->greet($nameRasmus);
  2. public function greet(string $name): string

    16public function greet(string $nameRasmus): string17{18    return strtoupper($thisLoudGreeter->baseGreet($nameRasmus));19}
  3. public function greet(string $name): string

    3{4    public function greet(string $nameRasmus): string5    {6        return "hello " . $nameRasmus;7    }
  4. $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