В PHP отсутствует прямое множественное наследование классов (как в C++). Попытка унаследовать от нескольких классов вызовет фатальную ошибку:
class A {}
class B {}
class C extends A, B {} // Ошибка: Syntax error
Трейты позволяют включать методы в классы без наследования:
trait Loggable {
public function log($message) {
echo "[LOG] $message";
}
}
trait Cacheable {
public function cache($data) {
// Логика кэширования
}
}
class Product {
use Loggable, Cacheable; // Используем оба трейта
}
$product = new Product();
$product->log('Product created'); // Метод из Loggable
$product->cache($data); // Метод из Cacheable
Особенности трейтов:
insteadof
и as
Вместо наследования - включение объектов:
class Logger {
public function log($message) { /* ... */ }
}
class Cacher {
public function cache($data) { /* ... */ }
}
class Product {
public function __construct(
private Logger $logger,
private Cacher $cacher
) {}
}
Комбинация для частичной реализации:
interface LoggableInterface {
public function log($message);
}
trait LoggableTrait {
public function log($message) {
echo $message;
}
}
class Product implements LoggableInterface {
use LoggableTrait;
}
Хотя PHP не поддерживает прямое множественное наследование классов, трейты предоставляют гибкую альтернативу для повторного использования кода, а композиция объектов часто является более предпочтительным подходом с точки зрения архитектуры.