A trait can provide methods that update state stored on the object.

shared state helper Trait methods are useful when several classes need the same small state update.

Trait State

items
trait_state.php
Replay: real traced execution (multi-file project)
<?php
trait CountsItems
{
    private int $count = 0;

    public function add(int $items): int
    {
        $this->count = $this->count + $items;
        return $this->count;
    }
}

class Basket
{
    use CountsItems;
}

$items = 3;
$basket = new Basket();
$total = $basket->add($items);

echo "items=" . $items . "\n";
echo "total=" . $total . "\n";
<?php
trait CountsItems
{
    private int $count = 0;

    public function add(int $items): int
    {
        $this->count = $this->count + $items;
        return $this->count;
    }
}

class Basket
{
    use CountsItems;
}

$items = 1;
$basket = new Basket();
$total = $basket->add($items);

echo "items=" . $items . "\n";
echo "total=" . $total . "\n";
<?php
trait CountsItems
{
    private int $count = 0;

    public function add(int $items): int
    {
        $this->count = $this->count + $items;
        return $this->count;
    }
}

class Basket
{
    use CountsItems;
}

$items = 5;
$basket = new Basket();
$total = $basket->add($items);

echo "items=" . $items . "\n";
echo "total=" . $total . "\n";
  1. $items ← 3, $basket ← Basket

    18$items→ 3 = 3; //@items=1, 519$basket→ Basket = new Basket();20$total = $basketBasket->add($items3);
  2. $this->count ← 3

    6public function add(int $items3): int7{8    $this->count→ 3 = $this->count + $items3;9    return $this->count3;10}
    values this stepBasket$this
  3. $total ← 3

    19$basket = new Basket();20$total→ 3 = $basketBasket->add($items3);2122echo "items=" . $items3 . "\n";23echo "total=" . $total3 . "\n";
    outputitems=3
    total=3
  1. $items ← 1, $basket ← Basket

    18$items→ 1 = 1;19$basket→ Basket = new Basket();20$total = $basketBasket->add($items1);
  2. $this->count ← 1

    6public function add(int $items1): int7{8    $this->count→ 1 = $this->count + $items1;9    return $this->count1;10}
    values this stepBasket$this
  3. $total ← 1

    19$basket = new Basket();20$total→ 1 = $basketBasket->add($items1);2122echo "items=" . $items1 . "\n";23echo "total=" . $total1 . "\n";
    outputitems=1
    total=1
  1. $items ← 5, $basket ← Basket

    18$items→ 5 = 5;19$basket→ Basket = new Basket();20$total = $basketBasket->add($items5);
  2. $this->count ← 5

    6public function add(int $items5): int7{8    $this->count→ 5 = $this->count + $items5;9    return $this->count5;10}
    values this stepBasket$this
  3. $total ← 5

    19$basket = new Basket();20$total→ 5 = $basketBasket->add($items5);2122echo "items=" . $items5 . "\n";23echo "total=" . $total5 . "\n";
    outputitems=5
    total=5