Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вопрос по singleton

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
clockwerk
Отправлено: 14 Октября, 2015 - 18:04:49
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




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

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. class db {
  4.     const DB_HOST = 'localhost';
  5.     const DB_USER = 'root';
  6.     const DB_PASS = '';
  7.     const DB_NAME = 'test';
  8.  
  9.     protected static $instance;  
  10.  
  11.     static function getInstance(){
  12.         if (self::$instance == NULL){
  13.             self::$instance = new mysqli(self::DB_HOST, self::DB_USER, self::DB_PASS, self::DB_NAME);
  14.             if(mysqli_connect_errno()) {
  15.                 throw new Exception("Database connection failed: ".mysqli_connect_error());
  16.             }
  17.         }
  18.         return self::$instance;
  19.     }
  20.  
  21.     private function __construct(){}
  22.  
  23.     private function __clone() {}
  24.  

Я его использую так:
PHP:
скопировать код в буфер обмена
  1.  
  2. db::getInstance()->query("Какой то запрос');
  3.  


Просто я не могу понять, какой смыл если допустим у меня этот класс лежит в файле db.php, я допустим подключаю(require) его в файле index.php и например handler.php, т.е. уже получается что 2 раза идет подключение к бд, значит это уже не singleton? С тем же успехом можно было бы использовать в каждом файле
PHP:
скопировать код в буфер обмена
  1.  
  2. $instance = new mysqli(host, user, pass db);
  3.  
  4. $instance->query("Запрос")
  5.  


Или это у меня не пример синглтона? Если нет просьба привести пример такого класса. Заранее благодарю
 
 Top
Мелкий Супермодератор
Отправлено: 14 Октября, 2015 - 18:11:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Если вы попробуете подключить этот файл дважды - вы получите fatal error за попытку повторно объявить класс.


-----
PostgreSQL DBA
 
 Top
clockwerk
Отправлено: 14 Октября, 2015 - 18:55:30
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Мелкий пишет:
Если вы попробуете подключить этот файл дважды - вы получите fatal error за попытку повторно объявить класс.


Я щас проверил, файл index.php
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. require_once 'db.php';
  4. echo 1;
  5.  

файл handler.php

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. require_once 'db.php';
  4. echo 1;
  5.  


localhost/index.php переходит выводит 1
localhost/handler.php аналогично переходит выводит 1

Никаких fatal error не наблюдается... Или вы не это имели ввиду?
Или вы имели ввиду что то типа
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. require 'db.php';
  4. Какой то код
  5.  
  6. require 'db.php';
  7.  

Только тогда непонятно зачем вобще 2 раза в 1 файле подключать

(Отредактировано автором: 14 Октября, 2015 - 18:59:48)

 
 Top
Мелкий Супермодератор
Отправлено: 14 Октября, 2015 - 20:06:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




clockwerk пишет:
localhost/index.php переходит выводит 1
localhost/handler.php аналогично переходит выводит 1

Никаких fatal error не наблюдается...

Потому что во-первых, это разные потоки выполнения.
Во-вторых, потому что _once

clockwerk пишет:
Только тогда непонятно зачем вобще 2 раза в 1 файле подключать

А мне непонятно, зачем вообще руками require делать, когда весь мир давным-давно пользуется автозагрузкой.

Смысл одиночки в реалиях PHP - держать открытым коннект к базе в рамках обработки одного HTTP-запроса.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 14 Октября, 2015 - 22:35:42
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Спойлер (Отобразить)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
clockwerk
Отправлено: 15 Октября, 2015 - 12:35:15
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Ладно я понял что ничего не понял. Рано мне еще для патернов програмирования, если я не понимаю сути самого простого из них. Все равно всем спасибо за ответы.

P.S. require я привел для примера.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB