Я знаю, что это, вероятно, вызовет ненужную войну пламени, но я могу видеть, как вам может потребоваться более одного подключения к базе данных, поэтому я бы согласился с тем, что Singleton может быть не лучшим решением для этого ... однако Есть и другие варианты использования шаблона синглтона, которые я считаю чрезвычайно полезными.
Вот пример: я решил запустить свой собственный MVC и шаблонизатор, потому что я хотел что-то действительно легкое. Однако данные, которые я хочу отобразить, содержат много специальных математических символов, таких как & ge; и & mu; и что у вас ... Данные хранятся как фактические символы UTF-8 в моей базе данных, а не как предварительно закодированные в формате HTML, потому что мое приложение может предоставлять другие форматы, такие как PDF и CSV в дополнение к HTML. Подходящее место для форматирования для HTML находится внутри шаблона («вид», если хотите), который отвечает за рендеринг этого раздела страницы (фрагмент). Я хочу преобразовать их в соответствующие им объекты HTML, но функция PHP get_html_translation_table () не является супер быстрой. Имеет смысл извлечь данные один раз и сохранить их в виде массива, что сделает их доступными для всех. Вот образец, который я собрал, чтобы проверить скорость. Предположительно, это будет работать независимо от того, были ли другие методы, которые вы используете (после получения экземпляра), статическими или нет.
class EncodeHTMLEntities {
private static $instance = null;//stores the instance of self
private $r = null;//array of chars elligalbe for replacement
private function __clone(){
}//disable cloning, no reason to clone
private function __construct()
{
$allEntities = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
$specialEntities = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
$this->r = array_diff($allEntities, $specialEntities);
}
public static function replace($string)
{
if(!(self::$instance instanceof self) ){
self::$instance = new self();
}
return strtr($string, self::$instance->r);
}
}
//test one million encodings of a string
$start = microtime(true);
for($x=0; $x<1000000; $x++){
$dump = EncodeHTMLEntities::replace("Reference method for diagnosis of CDAD, but clinical usefulness limited due to extended turnaround time (≥96 hrs)");
}
$end = microtime(true);
echo "Run time: ".($end-$start)." seconds using singleton\n";
//now repeat the same without using singleton
$start = microtime(true);
for($x=0; $x<1000000; $x++){
$allEntities = get_html_translation_table(HTML_ENTITIES, ENT_NOQUOTES);
$specialEntities = get_html_translation_table(HTML_SPECIALCHARS, ENT_NOQUOTES);
$r = array_diff($allEntities, $specialEntities);
$dump = strtr("Reference method for diagnosis of CDAD, but clinical usefulness limited due to extended turnaround time (≥96 hrs)", $r);
}
$end = microtime(true);
echo "Run time: ".($end-$start)." seconds without using singleton";
В основном я видел типичные результаты, подобные этому:
php test.php
Run time: 27.842966794968 seconds using singleton
Run time: 237.78191494942 seconds without using singleton
Итак, хотя я, конечно, не эксперт, я не вижу более удобного и надежного способа уменьшить накладные расходы на медленные вызовы для некоторого вида данных, в то же время делая его очень простым (одна строка кода, чтобы делать то, что вы необходимость). Конечно, в моем примере есть только один полезный метод, и поэтому он ничуть не лучше глобальной функции, но как только у вас появятся два метода, вы захотите сгруппировать их, верно? Я далеко от базы?
Кроме того, я предпочитаю примеры, которые на самом деле что-то делают, поскольку иногда трудно визуализировать, когда пример включает в себя такие выражения, как «// сделать что-то полезное здесь», которые я вижу все время при поиске учебников.
В любом случае, я хотел бы получить любые отзывы или комментарии о том, почему использование синглтона для такого типа вещей вредно (или слишком сложно).