3v4l.org

run code in 300+ PHP versions simultaneously
<?php namespace RefactoringGuru\Singleton\RealWorld; /** * Если вам необходимо поддерживать в приложении несколько типов Одиночек, вы * можете определить основные функции Одиночки в базовом классе, тогда как * фактическую бизнес-логику (например, ведение журнала) перенести в подклассы. */ class Singleton { /** * Реальный экземпляр одиночки почти всегда находится внутри статического * поля. В этом случае статическое поле является массивом, где каждый * подкласс Одиночки хранит свой собственный экземпляр. */ private static $instances = []; /** * Конструктор Одиночки не должен быть публичным. Однако он не может быть * приватным, если мы хотим разрешить создание подклассов. */ protected function __construct() { } /** * Клонирование и десериализация не разрешены для одиночек. */ protected function __clone() { } public function __wakeup() { throw new \Exception("Cannot unserialize singleton"); } /** * Метод, используемый для получения экземпляра Одиночки. */ public static function getInstance() { $subclass = static::class; if (!isset(self::$instances[$subclass])) { // Обратите внимание, что здесь мы используем ключевое слово // "static" вместо фактического имени класса. В этом контексте // ключевое слово "static" означает «имя текущего класса». Эта // особенность важна, потому что, когда метод вызывается в // подклассе, мы хотим, чтобы экземпляр этого подкласса был создан // здесь. self::$instances[$subclass] = new static(); } return self::$instances[$subclass]; } } /** * Класс ведения журнала является наиболее известным и похвальным использованием * паттерна Одиночка. */ class Logger extends Singleton { /** * Ресурс указателя файла файла журнала. */ private $fileHandle; /** * Поскольку конструктор Одиночки вызывается только один раз, постоянно * открыт всего лишь один файловый ресурс. * * Обратите внимание, что для простоты мы открываем здесь консольный поток * вместо фактического файла. */ protected function __construct() { $this->fileHandle = fopen('php://stdout', 'w'); } /** * Пишем запись в журнале в открытый файловый ресурс. */ public function writeLog(string $message): void { $date = date('Y-m-d'); fwrite($this->fileHandle, "$date: $message\n"); } /** * Просто удобный ярлык для уменьшения объёма кода, необходимого для * регистрации сообщений из клиентского кода. */ public static function log(string $message): void { $logger = static::getInstance(); $logger->writeLog($message); } } /** * Применение паттерна Одиночка в хранилище настроек – тоже обычная практика. * Часто требуется получить доступ к настройкам приложений из самых разных мест * программы. Одиночка предоставляет это удобство. */ class Config extends Singleton { private $hashmap = []; public function getValue(string $key): string { return $this->hashmap[$key]; } public function setValue(string $key, string $value): void { $this->hashmap[$key] = $value; } } /** * Клиентский код. */ Logger::log("Started!"); // Сравниваем значения одиночки-Логгера. $l1 = Logger::getInstance(); $l2 = Logger::getInstance(); if ($l1 === $l2) { Logger::log("Logger has a single instance."); } else { Logger::log("Loggers are different."); } // Проверяем, как одиночка-Конфигурация сохраняет данные... $config1 = Config::getInstance(); $login = "test_login"; $password = "test_password"; $config1->setValue("login", $login); $config1->setValue("password", $password); // ...и восстанавливает их. $config2 = Config::getInstance(); if ($login == $config2->getValue("login") && $password == $config2->getValue("password") ) { Logger::log("Config singleton also works fine."); } Logger::log("Finished!");

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.70.0130.01016.88
8.3.60.0040.01416.63
8.3.50.0170.00318.09
8.3.40.0090.00619.02
8.3.30.0000.01518.93
8.3.20.0090.00024.18
8.3.10.0040.00424.66
8.3.00.0090.00026.16
8.2.180.0090.00625.92
8.2.170.0150.00618.91
8.2.160.0050.00822.96
8.2.150.0040.00425.66
8.2.140.0000.00824.66
8.2.130.0080.00026.16
8.2.120.0030.00526.16
8.2.110.0040.00422.13
8.2.100.0070.00417.97
8.2.90.0000.00817.93
8.2.80.0000.00819.28
8.2.70.0030.00617.63
8.2.60.0080.00018.15
8.2.50.0040.00418.10
8.2.40.0040.00421.21
8.2.30.0040.00419.49
8.2.20.0000.00818.29
8.2.10.0040.00419.49
8.2.00.0070.00019.39
8.1.280.0160.01025.92
8.1.270.0050.00323.99
8.1.260.0080.00026.35
8.1.250.0040.00428.09
8.1.240.0030.00623.87
8.1.230.0080.00322.71
8.1.220.0000.00817.91
8.1.210.0000.00918.77
8.1.200.0000.00817.35
8.1.190.0060.00317.48
8.1.180.0090.00018.10
8.1.170.0030.00518.72
8.1.160.0000.00820.72
8.1.150.0040.00418.91
8.1.140.0040.00418.99
8.1.130.0030.00520.23
8.1.120.0000.00817.69
8.1.110.0030.00617.60
8.1.100.0030.00617.51
8.1.90.0040.00417.59
8.1.80.0030.00617.52
8.1.70.0040.00417.66
8.1.60.0000.00917.63
8.1.50.0030.00517.66
8.1.40.0080.00017.58
8.1.30.0000.00917.83
8.1.20.0090.00017.74
8.1.10.0030.00517.70
8.1.00.0000.00817.63
8.0.300.0000.00720.21
8.0.290.0000.00816.98
8.0.280.0050.00318.53
8.0.270.0000.00717.09
8.0.260.0030.00318.59
8.0.250.0070.00017.15
8.0.240.0030.00317.09
8.0.230.0030.00317.09
8.0.220.0030.00317.15
8.0.210.0040.00517.12
8.0.200.0030.00517.13
8.0.190.0040.00417.01
8.0.180.0050.00317.16
8.0.170.0030.00617.14
8.0.160.0030.00817.01
8.0.150.0000.00816.95
8.0.140.0070.00016.91
8.0.130.0000.00613.43
8.0.120.0000.00717.06
8.0.110.0040.00417.06
8.0.100.0040.00416.98
8.0.90.0040.00417.02
8.0.80.0050.01017.02
8.0.70.0000.00717.11
8.0.60.0000.00716.86
8.0.50.0040.00417.07
8.0.30.0070.01116.99
8.0.20.0190.01317.07
8.0.10.0340.00317.11
8.0.00.0230.00817.07
7.4.330.0060.00015.55
7.4.320.0030.00316.64
7.4.300.0070.00316.64
7.4.290.0070.00016.69
7.4.280.0040.00416.62
7.4.270.0000.00716.61
7.4.260.0030.00616.50
7.4.250.0000.00716.67
7.4.240.0040.00416.64
7.4.230.0070.00016.65
7.4.220.0030.00616.60
7.4.210.0100.00416.64
7.4.200.0000.00716.71
7.4.160.0060.01316.68
7.4.150.0130.02216.45
7.4.140.0260.01116.62
7.4.130.0250.00916.54
7.4.120.0260.00416.70
7.4.110.0220.00916.62
7.4.100.0280.00416.69
7.4.90.0170.01716.44
7.4.80.0280.00416.79
7.4.70.0410.00616.70
7.4.60.0220.01216.61
7.4.50.0190.01616.56
7.4.40.0180.01316.48
7.4.30.0230.00716.53
7.4.20.0220.01116.68
7.4.10.0180.01216.39
7.4.00.0230.01416.64
7.3.330.0050.00316.43
7.3.320.0000.00813.41
7.3.310.0040.00416.48
7.3.300.0000.00716.59
7.3.290.0070.00816.55
7.3.280.0090.02316.43
7.3.270.0230.01016.44
7.3.260.0210.01616.42
7.3.250.0170.01416.56
7.3.240.0250.01116.48
7.3.230.0240.01116.44
7.3.220.0330.00716.44
7.3.210.0240.01416.46
7.3.200.0270.00816.40
7.3.190.0200.01316.42
7.3.180.0160.01316.38
7.3.170.0270.00516.45
7.3.160.0150.01516.48
7.3.150.0160.01916.44
7.3.140.0210.01216.48
7.3.130.0270.00516.41
7.3.120.0200.01016.50
7.3.110.0180.01116.47
7.3.100.0240.01016.48
7.3.90.0210.00716.58
7.3.80.0230.00716.46
7.3.70.0200.01016.51
7.3.60.0130.01316.54
7.3.50.0210.00816.53
7.3.40.0240.00516.57
7.3.30.0200.01216.52
7.3.20.0180.01116.55
7.3.10.0160.01616.48
7.3.00.0300.00416.53

preferences:
71.28 ms | 401 KiB | 5 Q