ОсновноеRadiotalkПользовательское
Программирование
6   •   Посмотреть все темы

Вопросы из области php

 

1555
Алексей @TheDark
Вопрос к знающим. По вашему опыту, как лучше организовать взаимодействие с БД, используя ООП?
Есть класс Database, в котором создается подключение к БД со всеми соответствующими методами (типо **********)

Как сделать запрос к БД из другого класса? Неужели в каждом классе нужно создавать новый экземпляр Database и делать новое подключение?
Сейчас у меня устроено так: есть основной класс Main, который единожды вызывается в index.php и в котором происходит что-то такое:
  1. public static $db;
  2. public function __construct() {
  3. self::$db = new Database();
  4. }

Затем из всех остальных классов я делаю запрос к БД методом Main::$db->query();
Да и вообще в класс Main вынес различные функции, которые могут быть использованы повсеместно, сделал их статическими и обращаюсь к ним все также через Main::function()

Это нормально или говнокод? Где-то читал, что статические методы и свойства рекомендуется использовать только в крайнем случае, а тут как бы на них все завязано (кроме Database, таким методом работаю с еще несколькими ключевыми классами).

Поделитесь, как делаете вы на практике.

Отредактировано TheDark - 07.11.2017
0
8497
Степан @Trilby
У тебя в index.php должен подключаться файл-autoload (google://psr-4 autoload) и инициализироваться приложение.

Вот, например, мой немного обрезанный index.php:
  1. <?php
  2. require __DIR__ . '/../vendor/autoload.php';
  3. session_start();
  4. // Instantiate the app
  5. $settings = require __DIR__ . '/../core/settings.php';
  6. $app = new \Vendor\App($settings); //Vendor - your app vendor
  7. // Run app
  8. $app->run();

Ну, а работу с бд можно запихнуть в **********, после чего в классах писать что-то вроде:

  1. <?php
  2. use \Vendor\App\DataBase;
  3. ...
  4. $db = new DB();
  5. $db->prepare('...');
  6. $db->execute();
  7. ...

А когда наиграешься со своими велосипедами, можешь подключить один из готовых ORM (Eloquent, Doctrine, или что-то еще) и работать с базой через него.

Отредактировано Trilby - 07.11.2017
0
1555
Алексей @TheDark
Trilby, автолоад есть, синглтон - это тема, спасибо. а для велосипеда есть причины. в частности, мне нужен опыт проектирования приложений. начинать с фреймворков глупо.

0
1555
Алексей @TheDark
Кто-то сталкивался с таким, что функция extract() не работает, если ее обернуть в другую функцию? Например:
  1. public function extractVars()
  2. {
  3. foreach ($this->vars as $vars) {
  4. extract($vars);
  5. }
  6. }

Если же вызвать этот код напрямую в каждом нужном методе класса (а не $this->extractVars()), то все отработает:
  1. foreach ($this->vars as $vars) {
  2. extract($vars);
  3. }

Что за магия?

Отредактировано TheDark - 11.03.2018
0
20090
Dimitry @Dimitry
Достаточно понимать что делает эта функция.
Она создаёт переменные из массива и так как ты вызываешь её в функции, то эти переменные будут доступны только в функции, а тебе они видимо нужны снаружи.

0
1555
Алексей @TheDark
Dimitry, Все, я понял. Не подумал об области видимости...

0
1555
Алексей @TheDark
Работаю сейчас над проектом, к которому хочу прикрутить платную подписку. Нужно сделать возможность оплаты на разные периоды (например, 1 мес, 6 мес, год и т.д.) и соответственно давать новый функционал оплатившим пользователям. У меня есть свое представление как это можно было бы организовать, но я такого еще не делал. Мог бы кто-то поделиться опытом, как организовать такое на своем проекте или где можно подробно почитать об этом от А до Я, best practices так сказать?

0
2
Николай @75859
И как, решили проблему?

0
327
Геннадий @mychatik
✯ЯНОЧКА✯ пишет:

Кто нибудь может подсказать в чем ошибка. Должно запускаться вращение картинки и включаться радио по нажатию кнопки крутить пластинку.

Первая ошибка - если берётся откуда-то код, то его нужно для начала установить так, как в оригинале, а потом переделывать.
А в оригинале - скрипт ставится в самом конце, перед </body>.
После этого - пластинка начинает крутиться и включается музыка.

По кнопке "Остановить" - картинка останавливается, но музыка продолжает играть.
Почему - тут я не знаю.

Ну и ещё - для HTML5 и CSS3 нужно указывать только <!DOCTYPE html> для всех документов.

0





Согласие на обработку данных на нашем сайте

Продолжая просматривать страницу, вы соглашаетесь с использованием файлов «Cookie» и с Политикой конфиденциальности «Privacy».
Наверху или внизу страницы вы можете изменить валюту и язык по умолчанию. Английская версия сайта ещё находится в доработке и доступна не полностью.