Interfaces and Traits
Trait State
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
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";
$items ← 3, $basket ← Basket
18$items→ 3 = 3; //@items=1, 519$basket→ Basket = new Basket();20$total = $basketBasket->add($items3);$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$total ← 3
19$basket = new Basket();20$total→ 3 = $basketBasket->add($items3);2122echo "items=" . $items3 . "\n";23echo "total=" . $total3 . "\n";outputitems=3 total=3
$items ← 1, $basket ← Basket
18$items→ 1 = 1;19$basket→ Basket = new Basket();20$total = $basketBasket->add($items1);$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$total ← 1
19$basket = new Basket();20$total→ 1 = $basketBasket->add($items1);2122echo "items=" . $items1 . "\n";23echo "total=" . $total1 . "\n";outputitems=1 total=1
$items ← 5, $basket ← Basket
18$items→ 5 = 5;19$basket→ Basket = new Basket();20$total = $basketBasket->add($items5);$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$total ← 5
19$basket = new Basket();20$total→ 5 = $basketBasket->add($items5);2122echo "items=" . $items5 . "\n";23echo "total=" . $total5 . "\n";outputitems=5 total=5