Concept Flow - Why traits are needed
Class A
Class B
Need shared methods
Use Traits
Reuse code in multiple classes
Traits allow sharing methods across classes without using inheritance, solving code reuse problems.
<?php trait Logger { public function log($msg) { echo $msg . "\n"; } } class User { use Logger; } $user = new User(); $user->log("User created"); ?>
| Step | Action | Evaluation | Result |
|---|---|---|---|
| 1 | Define trait Logger with method log() | Trait Logger created | Logger trait ready |
| 2 | Define class User using trait Logger | User class includes Logger methods | User class has log() |
| 3 | Create instance $user of User | $user is an object of User | Object $user created |
| 4 | Call $user->log('User created') | log() method runs | Output: User created |
| 5 | End of script | No more code | Execution stops |
| Variable | Start | After 1 | After 2 | After 3 | Final |
|---|---|---|---|---|---|
| $user | undefined | undefined | undefined | User object | User object |
Traits let PHP classes reuse methods without inheritance.
Use 'trait TraitName { }' to define.
Use 'use TraitName;' inside classes to include.
Solves code reuse when multiple classes need same methods.
Avoids single inheritance limits.trait Logger { function log($msg) { echo $msg; } }Logger inside a class File?use keyword inside the class body.include is for files, extends is for inheritance, implements is for interfaces.trait Hello { function sayHello() { echo 'Hello'; } } class A { use Hello; } $obj = new A(); $obj->sayHello();trait Logger { function log() { echo 'Log'; } } class File { use Logger } $f = new File(); $f->log();use Logger inside class, a semicolon is required.trait A { function say() { echo 'A'; } } trait B { function say() { echo 'B'; } }How do you use both traits in a class Test so that say() from trait B is used?insteadof to choose one.use A, B { B::say insteadof A::say; } to prefer B's say().Pass the test and this pattern moves unknown