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
Форумы портала PHP.SU :: Версия для печати :: Вопрос по singleton
Форумы портала PHP.SU » » Вопросы новичков » Вопрос по singleton

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

1. clockwerk - 14 Октября, 2015 - 18:04:49 - перейти к сообщению
Добрый день господа. Возник такой вопросик, я в 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.  


Или это у меня не пример синглтона? Если нет просьба привести пример такого класса. Заранее благодарю
2. Мелкий - 14 Октября, 2015 - 18:11:27 - перейти к сообщению
Если вы попробуете подключить этот файл дважды - вы получите fatal error за попытку повторно объявить класс.
3. clockwerk - 14 Октября, 2015 - 18:55:30 - перейти к сообщению
Мелкий пишет:
Если вы попробуете подключить этот файл дважды - вы получите 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 файле подключать
4. Мелкий - 14 Октября, 2015 - 20:06:04 - перейти к сообщению
clockwerk пишет:
localhost/index.php переходит выводит 1
localhost/handler.php аналогично переходит выводит 1

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

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

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

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

Смысл одиночки в реалиях PHP - держать открытым коннект к базе в рамках обработки одного HTTP-запроса.
5. EuGen - 14 Октября, 2015 - 22:35:42 - перейти к сообщению
Спойлер (Отобразить)
6. clockwerk - 15 Октября, 2015 - 12:35:15 - перейти к сообщению
Ладно я понял что ничего не понял. Рано мне еще для патернов програмирования, если я не понимаю сути самого простого из них. Все равно всем спасибо за ответы.

P.S. require я привел для примера.

 

Powered by ExBB FM 1.0 RC1