Рубрики
Uncategorized

Пример применения одноэлементного шаблона PHP

Автор оригинала: David Wong.

Эта статья иллюстрирует применение одноэлементного режима PHP. Поделитесь для вашей справки следующим образом:

В прошлом, когда я начинал работать, я часто подключался к базе данных. Каждый раз, когда я использовал базу данных, я использовал new для создания экземпляра и подключения один раз. В то время, поскольку количество подключений к базе данных было не очень частым, так что это было ничего. Позже супервайзер сказал мне, что если я буду подключаться к базе данных каждый раз, когда я часто читаю данные, давление на базу данных и систему будет большим. Позвольте мне выяснить, могу ли я подключиться к базе данных один раз, а затем использовать ее снова без нового подключения. В то время я никогда не думал о хорошем способе. Только когда я недавно узнал о режиме одноэлементного, я вдруг понял. Руководитель посоветовал мне использовать модель синглтона только потому, что я раньше не понимал модель разработки. Ну, говори поменьше глупостей. Давайте посмотрим на модель синглтона.

Одноэлементная модель (Модель ответственности):

Проще говоря, объект (прежде чем изучать шаблоны проектирования, ему необходимо понять объектно-ориентированные идеи) отвечает только за конкретную задачу;

Синглеты:

1. Конструктор должен быть помечен как private (Контроль доступа: Запретить внешнему коду создавать объекты с использованием новых операторов). Одноэлементные классы не могут быть созданы в других классах, но могут быть созданы только сами по себе.

2. Статические переменные-члены с экземпляром сохраненного класса

3. Наличие общего статического метода для доступа к этому экземпляру (обычно используется) getInstance() Метод для создания экземпляра одноэлементного класса с помощью instanceof Операторы могут определить, был ли создан экземпляр класса

Кроме того, вам необходимо создать __clone() Метод для предотвращения копирования (клонирования)объектов

Зачем использовать одноэлементный режим PHP?

1. Применение PHP в основном лежит в приложении базы данных, поэтому в приложении будет выполняться большое количество операций с базой данных. Использование режима с одним регистром позволяет избежать большого количества операций с базой данных. новые Ресурсы, потребляемые операциями.

2. Если в системе необходим класс для глобального управления некоторой информацией о конфигурации, его можно легко реализовать с помощью одноэлементного режима. Это можно увидеть в разделе фронтальный контроллер ZF.

3. В запросе страницы легко отлаживать, потому что весь код (например, класс операций с базой данных db) сосредоточен в одном классе. Мы можем устанавливать крючки в классе и выводить журналы, таким образом избегая везде. var_dump , эхо

Код (в официальных документах):

php
class Singletons{
  // Save class instances in this property
  private static $instance;
  // The constructor is declared private to prevent direct creation of objects
  private function __construct()
  {
    echo 'Iam constructed';
  }
  // singleton method
  public static function singleton()
  {
    if (!isset(self::$instance)) {
      $c = __CLASS__;
      self::$instance =new$c;
    }
    return self::$instance;
  }
  // Common methods in Example classes
  public function bark()
  {
    echo 'Woof!';
  }
  // Prevent users from copying object instances
  public function __clone()
  {
    trigger_error('Clone is not allowed.',E_USER_ERROR);
  }
}//endclass singletons
  // This is incorrect because the constructor is declared private
  //$test= new Singletons();
  // Next you will get the singleton object of the Example class
  $test= Singletons::singleton();
  $test->bark();
  // Copying objects will result in an E_USER_ERROR.
  $test_clone= clone $test;
?>

Результат:

Я создан! Гав! Фатальная ошибка: Клонирование не допускается. в E:\APMServ5.2.6\www\htdocs\Lee\myprogram\other\class\singletons.phpon строка 31

Следующий контент поступает из Интернета (вы можете ознакомиться с ним и узнать о нем):

Три основных момента одноэлементной модели:

(1) Требуется статическая переменная-член, содержащая уникальный экземпляр класса:

private static $_instance;

(2) Конструкторы и клоны должны быть объявлены закрытыми, чтобы новые классы внешних программ не теряли смысла одноэлементного шаблона:

private function __construct()
 {
   $this->_db = pg_connect('xxxx');
 }
 private function __clone()
 {
 }// Overlay _clone() method, prohibit cloning

(3). Должен быть предоставлен общий статический метод доступа к этому экземпляру (обычно getInstance Метод для возврата ссылки на уникальный экземпляр

public static function getInstance()
{
   if(! (self::$_instance instanceof self) )
   {
     self::$_instance = new self();
   }
   return self::$_instance;
}

2. Зачем использовать одноэлементную модель?

1. Недостатки PHP:

PHP-это интерпретирующий язык сценариев. Этот механизм позволяет интерпретировать и выполнять каждую страницу PHP, а все связанные с ней ресурсы будут переработаны. Другими словами, PHP не имеет возможности хранить объект в памяти на уровне языка, который отличается от скомпилированного типа, такого как asp. СЕТЬ и Java. Например, синглтон в Java всегда будет существовать на протяжении всего жизненного цикла приложения. Переменные находятся на межстраничном уровне. Это действительно может обеспечить уникальность этого экземпляра в жизненном цикле приложения. Однако в PHP все переменные, будь то глобальные переменные или статические члены классов, находятся на уровне страницы. Каждый раз при выполнении страницы новые объекты будут восстанавливаться и очищаться после выполнения страницы. Таким образом, кажется, что режим одноэлементного PHP не имеет смысла, поэтому я думаю, что режим одноэлементного PHP имеет только несколько сценариев приложений для одного запроса на уровне страницы. Очень важно совместно использовать один и тот же ресурс объекта.

2. Применение одноэлементного режима в PHP:

(1) Взаимодействие между приложением и базой данных

В приложении будет много операций с базой данных, таких как подключение к базе данных через дескриптор базы данных. Использование одноэлементного режима позволяет избежать множества новых операций, потому что каждый раз. новые Операции потребляют как память, так и системные ресурсы.

(2) Информация о конфигурации управления

Если в системе необходим класс для глобального управления некоторой информацией о конфигурации, можно легко реализовать одноэлементный режим.

3. Как реализовать синглетную модель?

1. Общие примеры доступа к базе данных:

addUserInfo(...);
 ......
// Access the database in the function to find user information
function getUserInfo()
{
  $db = new DB (...); // New database class again, and establish a connection to the database
  $db = query (...);// Access the database based on query statements
}
?>

2. Используйте одноэлементный режим для работы с базой данных:

_db = pg_connect(...);//postgrsql
  }
  Private function clone () {}; // Overlay clone () method, prohibit cloning
  public static function getInstance()
  {
    if(! (self::$_instance instanceof self) ) {
      self::$_instance = new self();
    }
    return self::$_instance;
  }
  public function addUserInfo(...)
  {
  }
   public function getUserInfo(...)
  {
  }
}
//test
$db = DB::getInstance();
$db->addUserInfo(...);
$db->getUserInfo(...);
?>

3. Глубокое Понимание

conn = mysql_connect($db['host'],$db['user'],$db['password']);
     if(!mysql_select_db($db['database'],$this->conn)){
      Echo "failure";
    };
    mysql_query('set names utf8',$this->conn);
  }
  public static function getInstance(){
    if(is_null(self::$instance)){
      self::$instance = new db;
    }
    return self::$instance;
  }
  /**
   * Query the database
   */
  public function select($table,$condition=array(),$field = array()){
    $where='';
    if(!empty($condition)){
      foreach($condition as $k=>$v){
        $where.=$k."='".$v."' and ";
      }
      $where='where '.$where .'1=1';
    }
    $fieldstr = '';
    if(!empty($field)){
      foreach($field as $k=>$v){
        $fieldstr.= $v.',';
      }
       $fieldstr = rtrim($fieldstr,',');
    }else{
      $fieldstr = '*';
    }
    self::$sql = "select {$fieldstr} from {$table} {$where}";
    $result=mysql_query(self::$sql,$this->conn);
    $resuleRow = array();
    $i = 0;
    while($row=mysql_fetch_assoc($result)){
      foreach($row as $k=>$v){
        $resuleRow[$i][$k] = $v;
      }
      $i++;
    }
    return $resuleRow;
  }
  /**
   * Add a record
   */
   public function insert($table,$data){
    $values = '';
    $datas = '';
    foreach($data as $k=>$v){
      $values.=$k.',';
      $datas.="'$v'".',';
    }
    $values = rtrim($values,',');
    $datas  = rtrim($datas,',');
    self::$sql = "INSERT INTO {$table} ({$values}) VALUES ({$datas})";
    if(mysql_query(self::$sql)){
      return mysql_insert_id();
    }else{
      return false;
    };
   }
   /**
   * Modify a record
   */
  public function update($table,$data,$condition=array()){
    $where='';
    if(!empty($condition)){
      foreach($condition as $k=>$v){
        $where.=$k."='".$v."' and ";
      }
      $where='where '.$where .'1=1';
    }
    $updatastr = '';
    if(!empty($data)){
      foreach($data as $k=>$v){
        $updatastr.= $k."='".$v."',";
      }
      $updatastr = 'set '.rtrim($updatastr,',');
    }
    self::$sql = "update {$table} {$updatastr} {$where}";
    return mysql_query(self::$sql);
  }
  /**
   * Delete records
   */
   public function delete($table,$condition){
    $where='';
    if(!empty($condition)){
      foreach($condition as $k=>$v){
        $where.=$k."='".$v."' and ";
      }
      $where='where '.$where .'1=1';
    }
    self::$sql = "delete from {$table} {$where}";
    return mysql_query(self::$sql);
   }
  public static function getLastSql(){
    echo self::$sql;
  }
}
$db = db::getInstance();
//$list = $db->select('demo',array('name'=>'tom','password'=>'ds'),array('name','password'));
// echo $db - > insert ('demo', array ('name'=>'recently you','password'=>'123');
//echo $db->update('demo',array("name"=>'xxx',"password"=>'123'),array('id'=>1));
echo $db->delete('demo',array('id'=>'2'));
db::getLastSql();
echo "
";
?>

Больше читателей, интересующихся контентом, связанным с PHP, могут ознакомиться с темами этого сайта: Введение в объектно-ориентированное программирование Php, Введение в навыки работы с массивами PHP, Введение в базовую грамматику PHP, Краткое описание работы с PHP и использования операторов, Краткое описание использования строк Php, Введение в работу с базой данных php+mysql и общие операции с базами данных php. Краткое изложение навыков письма ___________

Я надеюсь, что эта статья будет полезна для разработки PHP – программ для всех.