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

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

 

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

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

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

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

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

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

Вот, например, мой немного обрезанный index.php:
<?php
require __DIR__ . '/../vendor/autoload.php';

session_start();

// Instantiate the app
$settings = require __DIR__ . '/../core/settings.php';
$app = new \Vendor\App($settings); //Vendor - your app vendor

// Run app
$app->run();

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

<?php
use \Vendor\App\DataBase;
...
$db = new DB();
$db->prepare('...');
$db->execute();
...

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

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

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

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

Что за магия?

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

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

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

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

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

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

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

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

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