Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: ООП
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
__PION__
956 / 797 / 85
Регистрация: 21.07.2010
Сообщений: 3,521
1

Корзина синглтон

24.09.2013, 07:39. Просмотров 1024. Ответов 13
Метки нет (Все метки)

Сделал 2 класса - корзина и мини-корзина (наследник предыдущего), оба синглтон, также и основной класс БД тоже такой же.
все работает, вопрос - правильно ли корзины делать синглтонами? чур не пинать, с ооп не очень
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 07:39
Ответы с готовыми решениями:

Синглтон отдает 2 ошибки
есть файл config.php, в котором прописаны глобальные переменные - настройки для...

Проверка порта, синглтон для процесса и др
Всем привет. Подскажите, кто сталкивался с подобным. Первый вопрос: я слышал,...

php корзина
Здравствуйте. Очень нужна помощь. Пишу для дипломной работы подобие интернет...

Корзина покупок
Здраствуйте, нужна готовая корзина покупок. Пожалуйста, не писать в теме,...

Интернет-магазин, корзина
пишу интернет-магазин (это не коммерческий проект - просто тренировка) и...

13
Василий Макогон
270 / 226 / 11
Регистрация: 20.04.2012
Сообщений: 820
24.09.2013, 14:11 2
БД не должна быть сингелтоном, т.к. можно иметь разные подключения.
Корзина сингелтон - вполне возможно.
В любом случае, если не очень с ООП, не надо тупо и в слепую использовать паттерны, надо уметь думать - стоит ли их применять в данной конкретной ситуации.
0
__PION__
956 / 797 / 85
Регистрация: 21.07.2010
Сообщений: 3,521
24.09.2013, 15:01  [ТС] 3
Цитата Сообщение от Василий Макогон Посмотреть сообщение
БД не должна быть сингелтоном, т.к. можно иметь разные подключения.
хм.., несколько подключений к одной и той же БД? стока в инете видел, где наоборот советуют главный класс БД делать синглтон..

Не по теме:

кому верить..



Добавлено через 39 минут
почему я задал вопрос про 2 синглтона (корзина и мини-корзина) -
интересно, если я делаю переменную БД $db приватным, то мини-корзина возвращает
Код
<b>Fatal error</b>:  Call to a member function Select() on a non-object in <b>Z:\home\site\www\model\Cart.php</b> on line <b>104</b><br />
заменяю на protected - работает.
Select() - метод класса DB. Ругается на приватный метод внутри класса Cart


Чтобы было ясно покажу связи классов, что - куда - откуда берется:
БД
PHP
1
2
3
4
5
6
7
8
9
10
class DB
{
    private static $instance;
 
    // insert, update, delete, ..
 
}
 
// Вызов в конфиге
$db = DB::Instance();
Cart
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Cart
{
    private static $instance;
    protected $db;
 
    private function __construct() {
       $this->db = DB::Instance();
    }
    
    /* 
       разные методы для работы с корзиной, 
       включая и получение общей суммы и общего кол-ва товаров в корзине. 
       этот метод использует наследник SmallCart для вывода этих данных
    */
 
   // метод, на который ругается. Если его удалить ругается на следующий
   private function discount() {
        $q = "SELECT `id`, `iVal` FROM `".DB_PREFIX."model`";
        return $this->db->Select($q, 'id');
    }
    /*
         Эта ф-я используется в ф-ии cartData(), которая вызывается в наследнике
    */
}
 
// Вызов в index.php
require_once ROOT . 'model/Cart.php';
$mCart = Cart::Instance();
и SmallCart
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class SmallCart extends Cart
{
    private static $instance;
    protected $db;
 
    private function __construct() {
       $this->db = DB::Instance();
    }
 
   // Один метод - вывод маленькой корзины
   public function printMiniCart() {
      $aMiniCart = $this->cartData();  // Метод cartData() из класса родителя. возвращает кол-во товаров и сумму
      // ...
   }
}
 
// Вызов. Вызывается  ч/з аякс при загрузке страницы
require_once '../model/SmallCart.php';
$mSmallCart = SmallCart::Instance();
echo $mSmallCart->printMiniCart();
Так вот, стоит заменить protected на private у переменной $db, то выводится ошибка.
Все файлы подключены, все всех видят
0
AndreyDyakonov
122 / 120 / 7
Регистрация: 21.04.2013
Сообщений: 615
24.09.2013, 18:36 4
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
интересно, если я делаю переменную БД $db приватным
ошибка в том, что если в корзине $db приватная, то мини корзина ее не видит и создает свою переменную, которая, естественно не то что не объект базы данных, а просто null

приватные свойства(методы) недоступны наследникам
1
__PION__
956 / 797 / 85
Регистрация: 21.07.2010
Сообщений: 3,521
24.09.2013, 19:07  [ТС] 5
Цитата Сообщение от AndreyDyakonov Посмотреть сообщение
приватные свойства(методы) недоступны наследникам
ну это я знаю.
просто не пойму, зачем мини-корзине $db родителя? ну пускай будет свой, я же в конструкторе мини-корзины вызываю метод главного класса БД. почему там свой объект не образуется не понятно.
разве синглтон не должен быть приватным?
$db вообще нужно для подключения к БД и там еще общие ф-ии, никак не зависящие от класса родителя (т.е., от Cart).
или при наследовании как по другому это происходит? В синглтоне вызов конструктора родителя происходит как обычно?
0
AndreyDyakonov
122 / 120 / 7
Регистрация: 21.04.2013
Сообщений: 615
24.09.2013, 19:22 6
попробуем так:
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
PHP
1
2
3
4
5
// метод, на который ругается. Если его удалить ругается на следующий
* *private function discount() {
* * * * $q = "SELECT `id`, `iVal` FROM `".DB_PREFIX."model`";
* * * * return $this->db->Select($q, 'id');
* * }
здесь $this->db->Select($q, 'id'); это родительский db.. функция discount доступна детям, а $db недоступна... Попробуйте вставить в конструктор ребенка, вызов конструктора родителя... скорее всего так
Но непонятно конечно, зачем вы под одним именем сохраняете объект базы данных. это сразу путаница и ошибки
0
OnYourLips
506 / 356 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
24.09.2013, 19:24 7
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
хм.., несколько подключений к одной и той же БД? стока в инете видел, где наоборот советуют главный класс БД делать синглтон..
К разным.
Это обычная практика.
0
__PION__
956 / 797 / 85
Регистрация: 21.07.2010
Сообщений: 3,521
24.09.2013, 19:46  [ТС] 8
Цитата Сообщение от AndreyDyakonov Посмотреть сообщение
функция discount доступна детям
она не доступна детям. она используется методе, который доступен в наследнике.
Цитата Сообщение от AndreyDyakonov Посмотреть сообщение
Но непонятно конечно, зачем вы под одним именем сохраняете объект базы данных
какая разница, переменная приватная, и по-мойму имя $db говорит само за себя

Добавлено через 22 секунды
Цитата Сообщение от OnYourLips Посмотреть сообщение
К разным.
Это обычная практика.
а ну у меня одна БД
0
AndreyDyakonov
122 / 120 / 7
Регистрация: 21.04.2013
Сообщений: 615
24.09.2013, 19:55 9
Цитата Сообщение от Love_and_Peace Посмотреть сообщение
она не доступна детям.
елки.. рябило в глазах от private и protected.. Конечно и она недоступна.
Но все равно, зачем наследовать статичный член, если он один во всей программе.. По крайней мере в данном примере. Сделать его protected, а лишний код из наследников поудалять..
1
Frostiks25
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 10
25.09.2013, 19:44 10
Вообще правильно бы было сделать например отдельный класс одиночку под бд, и там уже создавать экземпляр основного класса бд
0
__PION__
956 / 797 / 85
Регистрация: 21.07.2010
Сообщений: 3,521
25.09.2013, 19:54  [ТС] 11
Цитата Сообщение от Frostiks25 Посмотреть сообщение
Вообще правильно бы было сделать например отдельный класс одиночку под бд
что в этот класс должно входить?
Цитата Сообщение от Frostiks25 Посмотреть сообщение
и там уже создавать экземпляр основного класса бд
где там?
0
OnYourLips
506 / 356 / 13
Регистрация: 12.03.2012
Сообщений: 1,896
25.09.2013, 20:38 12
Цитата Сообщение от Frostiks25 Посмотреть сообщение
Вообще правильно бы было сделать например отдельный класс одиночку под бд
Это не правильно.
0
Frostiks25
2 / 2 / 0
Регистрация: 23.09.2013
Сообщений: 10
26.09.2013, 19:58 13
А вот например
PHP
1
2
3
4
5
6
    public static function getBase() {
        if (null === self::$connecting) {
            self::$connecting = new database();
        }
        return self::$connecting;
    }
1
webuses
10 / 5 / 0
Регистрация: 27.09.2013
Сообщений: 26
27.09.2013, 16:19 14
Лучше создайте и для того и для другого абстрактные классы, после чего наследуйте от абстрактного, так как при желании что-то поменять в системе вам придется весь код переделывать, а это не является правилом хорошего тона.
Если я не ошибаюсь в книге четырех этот шаблон назван Abstract Factory.
И для создания системы вам лучше составить в начале UML шаблон, чтобы не было непонимания кода и тогда уже определиться с целями и задачами, как говорится лучше вас ни кто не знает что вы хотите.
0
27.09.2013, 16:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2013, 16:19

Корзина через сессии
Сделал корзину(интернет магазина). Корзина запоминает товары сессиями. Теперь...

Корзина товаров PHP ! :cry:
Я делаю интернет магазин - не получается сделать корзину : Сохранять то что в...

Корзина для интернет-магазина
Здравствуйте, я новичок и мне очень нужна корзина для моего интернет-магазина....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru