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