Форумы » Программирование »

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



1 ... 4 5 6 7

1555
TheDark
Вопрос к знающим. По вашему опыту, как лучше организовать взаимодействие с БД, используя ООП?
Есть класс Database, в котором создается подключение к БД со всеми соответствующими методами (типо [url=https://github.com/colshrapnel/safemysql/blob/master/safemysql.class.php]такого[/url])

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

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

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

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

Вот, например, мой немного обрезанный index.php:
[code]<?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();[/code]
Ну, а работу с бд можно запихнуть в [url=https://ruhighload.com/post/Singleton+%D0%B2+PHP+%D0%BD%D0%B0+%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5+%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BA+MySQL?utm_source=dlvr.it&utm_medium=gplus]singleton[/url], после чего в классах писать что-то вроде:

[code]<?php
use \Vendor\App\DataBase;
...
$db = new DB();
$db->prepare('...');
$db->execute();
...[/code]
А когда наиграешься со своими велосипедами, можешь подключить один из готовых ORM (Eloquent, Doctrine, или что-то еще) и работать с базой через него.

Отредактировано Trilby - 07.11.2017
1555
TheDark
[b]Trilby[/b], автолоад есть, синглтон - это тема, спасибо. а для велосипеда есть причины. в частности, мне нужен опыт проектирования приложений. начинать с фреймворков глупо.
1555
TheDark
Кто-то сталкивался с таким, что функция extract() не работает, если ее обернуть в другую функцию? Например:
[code]public function extractVars()
{
foreach ($this->vars as $vars) {
extract($vars);
}
}[/code]
Если же вызвать этот код напрямую в каждом нужном методе класса (а не $this->extractVars()), то все отработает:
[code]foreach ($this->vars as $vars) {
extract($vars);
}[/code]
Что за магия?

Отредактировано TheDark - 11.03.2018
19336
Dimitry
Достаточно понимать что делает эта функция.
Она создаёт переменные из массива и так как ты вызываешь её в функции, то эти переменные будут доступны только в функции, а тебе они видимо нужны снаружи.
1555
TheDark
[b]Dimitry[/b], Все, я понял. Не подумал об области видимости...
1555
TheDark
Работаю сейчас над проектом, к которому хочу прикрутить платную подписку. Нужно сделать возможность оплаты на разные периоды (например, 1 мес, 6 мес, год и т.д.) и соответственно давать новый функционал оплатившим пользователям. У меня есть свое представление как это можно было бы организовать, но я такого еще не делал. Мог бы кто-то поделиться опытом, как организовать такое на своем проекте или где можно подробно почитать об этом от А до Я, best practices так сказать?
2
75859
И как, решили проблему?
298
mychatik
[quote=✯ЯНОЧКА✯]Кто нибудь может подсказать в чем ошибка. Должно запускаться вращение картинки и включаться радио по нажатию кнопки крутить пластинку.[/quote]
Первая ошибка - если берётся откуда-то код, то его нужно для начала установить так, как в оригинале, а потом переделывать.
А в оригинале - скрипт ставится в самом конце, перед [b]</body>[/b].
После этого - пластинка начинает крутиться и включается музыка.

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

Ну и ещё - для [b]HTML5[/b] и [b]CSS3[/b] нужно указывать только [b]<!DOCTYPE html>[/b] для всех документов.
1 ... 4 5 6 7


Неавторизованные и новички не могут отправлять сообщения.

© 2008-2020
Контакты | Группа | Privacy и Cookie | Правила