PHP Паттерн “Прокси-объект” (Proxy) Создаёт объект-заместитель, который контролирует доступ к реальному объекту
interface User {
function getUsername();
}
class AdminUser implements User {
function getUsername() {
echo "Admin user";
}
}
class UserProxy {
private $_user;
function __construct($user) {
$this->_user = $user;
}
function _getUser() {
return $this->_user;
}
function fetchUser() {
try {
return $this->_getUser();
} catch (Exception $e) {
return new User();
}
}
}
$adminUser = new AdminUser();
$userProxy = new UserProxy($adminUser);
echo $userProxy->fetchUser()->getUsername();
Паттерн прокси-объект может быть полезен в следующих случаях:
Кеширование данных: Если получение данных из источника занимает много времени или требует больших ресурсов, можно использовать прокси-объект для кэширования данных. При первом обращении к прокси-объекту он запрашивает данные из источника и сохраняет их в кэше. При последующих обращениях он возвращает данные из кэша, не обращаясь к источнику. Управление доступом: Если вы хотите ограничить доступ к некоторым методам или свойствам объекта, вы можете создать прокси-объект, который будет предоставлять ограниченный интерфейс. Это позволяет контролировать доступ к объекту без необходимости изменять его исходный код. Контроль версий: Если у вас есть несколько версий объекта, вы можете использовать прокси-объект для управления версиями. Прокси-объект будет выбирать нужную версию объекта в зависимости от контекста или настроек. Отладка: Прокси-объекты могут быть полезны при отладке. Вы можете создать прокси-объект, который будет выводить отладочную информацию или выполнять дополнительные проверки. Безопасность: Прокси-объекты могут использоваться для обхода ограничений безопасности. Например, если у вас есть объект, который содержит конфиденциальную информацию, вы можете создать прокси-объект, который скрывает эту информацию и предоставляет только разрешенные данные.
Локализация: Если ваш проект имеет многоязычную поддержку, вы можете использовать прокси-объекты для локализации. Каждый прокси-объект будет отвечать за перевод определенного языка.