Checks whether a trait has been declared, with optional autoloading.
The examples focus on the operation itself, including the important distinction: class_exists checks classes; interface_exists checks interfaces.
What It Does
Use the examples below to observe the behavior on a small dataset before extending it to application code.
Syntax and Return Value
trait_exists(string $trait, bool $autoload = ...): bool
The displayed signature describes the API or identifies any correction or optional dependency. When a parameter is optional, supply it only when the task requires it.
Parameters
- trait: required.
- autoload: optional.
Declared return type: bool. Read the behavior notes for important cases such as empty collections and destructive iteration.
Example 1: Basic Use
The second argument disables autoloading to test a declaration already in memory.
<?php
trait PrintableCard { public function render(): string { return "ok"; } }
echo trait_exists('PrintableCard', false) ? "trait loaded" : "missing";
Output from a successful local PHP 8.4 run:
trait loaded
Example 2: Checking Behavior
The second argument disables autoloading to test a declaration already in memory. Only actual traits satisfy trait_exists, regardless of class or interface names.
<?php
trait PrintableCard { public function render(): string { return "ok"; } }
class PrinterClass {}
echo trait_exists('PrintableCard', false) ? "trait loaded" : "missing";
echo " class-as-trait=" . (trait_exists(PrinterClass::class, false) ? "yes" : "no");
Output from a successful local PHP 8.4 run:
trait loaded class-as-trait=no
Example 3: Practical Example
The second argument disables autoloading to test a declaration already in memory. Only actual traits satisfy trait_exists, regardless of class or interface names.
<?php
trait PrintableCard { public function render(): string { return "ok"; } }
interface PrinterInterface {}
echo trait_exists('PrintableCard', false) ? "trait loaded" : "missing";
echo " unknown-trait=" . (trait_exists("TraitNotLoaded", false) ? "yes" : "no");
Output from a successful local PHP 8.4 run:
trait loaded unknown-trait=no
Important Behavior and Edge Cases
A class that uses a trait is not itself a trait; autoloading can run code.
Comparison with Related Approaches
| Approach | Difference |
|---|---|
| trait_exists | Checks whether a trait has been declared, with optional autoloading. |
| Related API or alternative | class_exists checks classes; interface_exists checks interfaces. |
Common Beginner Mistakes
| Mistake | Correct approach |
|---|---|
| Ignoring the operation-specific limits | A class that uses a trait is not itself a trait; autoloading can run code. |
| Confusing it with a related API | class_exists checks classes; interface_exists checks interfaces. |
Key Takeaways
- Checks whether a trait has been declared, with optional autoloading.
- A class that uses a trait is not itself a trait; autoloading can run code.
- class_exists checks classes; interface_exists checks interfaces.
Use trait_exists when its documented behavior matches the problem. Test the relevant edge cases in your own runtime before deploying it.