КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

Singleton


Что такое шаблоны проектирования

В мире программного обеспечения, шаблон - это реальное проявление генетической памяти организации. - Гради Буч, из книги Core J2EE Patterns Шаблон - это решение задачи в некотором контексте. - "Банда четырех", из книги Design Patterns: Elements of Reusable Object Oriented Software Как следует из приведённых выше цитат, шаблон проектирования - это задача, взятая из практики передовых программистов, решение которой проанализировано и объяснено. Задачи имеют свойство повторяться, и веб-программистам приходится решать их снова и снова. Как обработать входящий запрос? Как преобразовать данные в команды для нашей системы? Как ввести данные? Как представить результаты? Со временем мы находим более или менее изящные ответы на эти вопросы и создаём неформальный набор методов, которые затем снова и снова используем в своих проектах. Эти методы - и есть шаблоны проектирования. Каталог шаблонов - это не книга кулинарных рецептов. Рецептам можно следовать буквально, а код можно скопировать и вставить в проект с незначительными изменениями. Вам не всегда нужно даже понимать весь код, используемый в этом "рецепте". Шаблоны проектирования описывают подходы к решению конкретных задач. Детали реализации могут существенно меняться в зависимости от более широкого контекста. От этого контекста зависит выбор используемого языка программирования, природа приложения, размер проекта и специфика задачи. И наконец, согласно международному законодательству, некорректно писать о шаблонах, не процитировав Кристофера Александера, профессора архитектуры, работы которого оказали огромное влияние на первых сторонников объектно-ориентированных шаблонов. Каждый шаблон описывает задачу, которая возникает снова и снова, а затем описывает суть решения данной задачи, так что вы можете использовать это решение миллион раз, каждый раз делая это по-разному

Шаблон Singleton

Глобальная переменная - это один из самых больших источников проблем для программиста, использующего ООП. Глобальные переменные привязывают классы к их контексту, подрывая основы инкапсуляции. Если в классе используется глобальная переменная, то его невозможно извлечь из одного приложения и применить в другом, не убедившись сначала, что в новом приложении не определяются такие же глобальные переменные. Но искушение использовать глобальные переменные всё равно остаётся. Причина в том, что бывают случаи, когда недостатки глобальных переменных - это цена, которую стоит заплатить за то, чтобы предоставить всем классам доступ к объекту. Давайте выделим действующие факторы данной проблемы:
  • Наш объект должен быть доступен для любого объекта в системе
  • Объект не должен сохраняться в глобальной переменной, значение которой может быть случайно запорчено
  • В системе не должно быть больше одного объекта singleton
Чтобы решить эту проблему, начнём с установления контроля над созданием экземпляров объектов. Мы создадим класс, экземпляр которого нельзя создать за его пределами. Может показаться, что это трудно сделать, но на самом деле это просто вопрос определения закрытого конструктора.

class Preferences{

  private static $instance;

  private function __construct() { } // закрываем конструктор
  private function __clone() { } // запрещаем клонирование

  public static function getInstance() {
    if ( empty( self::$instance ) ) {
        self::$instance = new self();
    }
    return self::$instance;
  }

}

Свойство $instance - закрытое и статическое, поэтому к нему нельзя получить доступ из-за пределов класса. Но у метода getInstance() есть доступ к нему. Поскольку этот метод общедоступный и статический, его можно вызвать через класс из какого-либо места сценария.
$pref = Preferences::getInstance();
Когда вызывается метод getInstance(), мы проверяем свойство Preferences::$instance. Если оно пусто, то создаём экземпляр класса Preferences и сохраняем его в свойстве. затем мы возвращаем этот экземпляр вызывающему коду. Поскольку статический метод getInstance() - это часть класса Preferences, у нас нет проблем с созданием его экземпляра, даже несмотря на то, что конструктор закрытый. Умеренное использование шаблона Singleton может улучшить проект системы, избавив её от излишнего загромождения при передаче ненужных объектов в системе. Шаблоны Singleton - это шаг вперёд по сравнению с использованием глобальных переменных в объектно-ориентированном контексте. Вы не сможете затереть объекты Singleton неправильными данными. Такой вид защиты особенно важен в версиях PHP, в которых нет поддержки пространств имён. Любой конфликт имён будет обнаружен на стадии компиляции, что приведёт к завершению выполнения сценария. Чаще всего Одиночка используется при доступе к базе данных, когда нам нужно только Одно подключение. Я использую Singleton примерно так:

namespace models;

class Connect {
  
  private static $connect = null;
  
  private function __construct(){}
  
  private function __clone(){}
  
  public static function setConnect($xml_file)
  {
    if(is_null(self::$connect)){   
     try{
        // читаем xml файл в обьект::
        $xml = simplexml_load_file(ROOT.$xml_file);
        $host = $xml->host[0];
        $dbname = $xml->dbname[0];
        $user = $xml->user[0];
        $password = $xml->password[0];
        
        $db = self::$connect = new \PDO('mysql: host='.$host.'; dbname='. $dbname, $user, $password);
        
        $db->setAttribute( \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION );
        $db->exec("SET NAMES 'utf8'"); 
        $db->exec("SET CHARACTER SET 'utf8'");
        $db->exec("SET SESSION collation_connection = 'utf8_general_ci'");
      
     }catch(\PDOException $err) { 
        echo 'Ошибка при соединении с БД ' . $err->getMessage(). '<br> 
              в файле '.$err->getFile().", строка ".$err->getLine() . "<br><br>Стэк вызовов: " . preg_replace('/#\d+/', '<br>$0', $err->getTraceAsString()); 
        $log = ROOT.'/log/PDOErrors.txt';
			  file_put_contents($log, $err->getMessage()." (".date("l, d-m-Y H:i:s").") - Ошибка коннекта к БД\r\n", FILE_APPEND);
        exit;  
      }

     return $db;
    
    }   
  }
	
}
2016.06.22

Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


    Яндекс.Метрика Яндекс.Метрика