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

21 Авг 2019 в 07:05
222 +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 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир