Как нужно сохранять состояние объекта? Наверное, названия вопроса трудно что-то понять, попытаюсь объяснить, чтобы было понятно.
Стояла задача сделать проверку на вхождение текущего IP в список исключений. Это делается просто вызовов статического метода (IpAddressExclusion::isExcluded), который пробегается по свойству-массиву IP (задан жестко в классе, плохо, но сейчас не в этом суть), и смотрит есть ли текущий IP юзера в этом массиве. Но проблема в том, что этот вызов метода вызывается на странице несколько раз и сейчас выходит так, что каждый раз делается такая же самая проверка, пусть даже она уже проводилась, а это ведь плохо?
Например, есть вызов этого метода в шапке сайта, потом в сайдбаре, а затем в футере - соответственно, если проверка выполнилась в шапке, то нет смысла делать её в сайдбаре и футере, а нужно просто вернуть сохраненное состояние (то есть лог. значение, которое сохранилось в свойстве при первой проверке в шапке)? Если так, то как это грамотно сделать? Правильно ли я понимаю, здесь нужен синглтон? Т.е. в методе isExcluded нужно сохранять состояние проверки и потом проверять если это свойство не null, то возвращать его? Но тогда получится что-то типа такой конструкции: IpAddressExclusion::getInstance()->isExcluded()? Это нормально, смущает что метод getInstance получается статическим, хотя не должен ведь?
Надеюсь понятно что я хочу, новичок ещё, но очень хочется сделать по-нормальному, поэтому всё так расписал :/

21 Авг 2019 в 07:05
198 +1
0
Ответы
1

Да, ваше предположение верно - для решения данной проблемы можно использовать шаблон Singleton. Шаблон Singleton позволяет создать только один экземпляр класса и предоставить к нему глобальную точку доступа.

В вашем случае, вам необходимо создать класс IpAddressExclusion со статическим методом getInstance(), который будет возвращать экземпляр класса. Далее, у класса IpAddressExclusion должно быть приватное свойство для хранения состояния проверки IP адресов.

Пример реализации класса IpAddressExclusion с использованием шаблона Singleton:

class IpAddressExclusion {
private static $instance;
private $isExcluded = null;
private $ipList = [/* ваш список IP адресов */];
private function __construct() {}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
public function isExcluded($userIp) {
if ($this->isExcluded !== null) {
return $this->isExcluded;
}
// Логика проверки наличия текущего IP в списке исключений
$this->isExcluded = in_array($userIp, $this->ipList);
return $this->isExcluded;
}
}

Теперь вы можете использовать класс IpAddressExclusion в вашем коде следующим образом:

$userIp = $_SERVER['REMOTE_ADDR']; // получаем IP адрес пользователя
$ipExclusion = IpAddressExclusion::getInstance();
$isExcluded = $ipExclusion->isExcluded($userIp);
if ($isExcluded) {
// ваша логика, если IP адрес исключен
} else {
// ваша логика, если IP адрес не исключен
}

Таким образом, при повторных вызовах метода isExcluded() в разных частях вашего кода, состояние проверки IP адреса будет сохранено и повторная проверка уже не будет производиться, что повысит производительность вашего приложения.

20 Апр в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 852 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир