Прочитать еще недостаточно, как в поговорке говорят - смотреть в книгу, видеть фигу. И никакие селфи на фоне книжек не помогут если после их прочтения вы все равно топите за синглтоны на статике Так что он в эту тему должен все over 100 файлов примера своей архитектуры для вас запощивать?
@Дюран, а ничего что @MouseZver уложился в несколько строчек кода, о каких "over 100 файлов" идёт речь??? Ещё раз повторю начинающему программисту ответ должен соответствовать уровню. ок уговорил, рисуй сюда пример своего кода где синглтон без статики @askanim, я так и не понял, ты к умным или к красивым? Или еще не определился?
там не код, а структура логики. --- Добавлено --- Он не сможет, или понимает и молчит, так как глобально задействовать, без статики свой класс БД, не сможет. --- Добавлено --- P.s: я знаю как во фреймворках работается с экземпляром класса по БД и на будущее присеку вопрос "а зачем нужна глобальная доступность"
Ты считаешь, что какие-то проблемы даёт работа с экземпляром? --- Добавлено --- Лучший вариант - держать БД в di-контейнере, вариант похуже, но приемлемый - положить в реестр.И в том и в другом случае синглтон не нужен.
А я считаю, что какие то проблемы дает работа с экземпляром во внутренней стороны ? Внешний Э. не будет доступен новому классу, если нету единой точки Containers, где все классы могут взаимодействовать. Иначе велосипедрон с доп аргументом $link, $db --- Добавлено --- И повторюсь --- Добавлено --- Можно вопрос ? - а зачем это автору ?
Пишем класс DB: PHP: class DB { private $pdo; public function __construct(PDO $pdo) { $this->pdo = $pdo; } public function query(string $sql, array $params = []): PDOStatement { $stmt = $this->prepare($sql, $params); $stmt->execute(); return $stmt; } public function prepare(string $sql, array $params = []): PDOStatement { $stmt = $this->pdo->prepare($sql); foreach ($params as $name => $value) { $stmt->bindValue($name, $value); } return $stmt; } } Конфигурируем в config/db.php: PHP: return [ 'config' => [ 'pdo' => [ 'dsn' => getenv('DB_DSN'), 'username' => getenv('DB_USERNAME'), 'password' => getenv('DB_PASSWORD'), ], ], PDO::class => static function (ContainerInterface $container) { $config = $container->get('config')['pdo']; return new PDO($config['dsn'], $config['username'], $config['password'], [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]); }, DB::class => static function (ContainerInterface $container) { return new DB($container->get(PDO::class)); }, ]; Используем его в модели чтения: PHP: class PostsFetcher { private $db; public function __construct(DB $db) { $this->db = $db; } public function all(): array { $stmt = $this->db->query('SELECT * FROM posts ORDER BY date DESC'); return $stmt->fetchAll(); } public function findBySlug(string $slug): ?array { $stmt = $this->db->query('SELECT * FROM posts WHERE slug = :slug', [':slug' => $slug]); return ($row = $stmt->fetch()) ? $row : null; } } Выводим посты в контроллере: PHP: class PostsController { private $posts; public function __construct(PostsFetcher $posts) { $this->posts = $posts; } public function index(Request $request, Response $response): Response { $posts = $this->posts->all(); return $response->withJson($posts); } public function show(Request $request, Response $response, array $args): Response { if (!$post = $this->posts->findBySlug($args['slug'])) { return $response->withJson([], 404); } return $response->withJson($post); } } Собираем сайт: PHP: $container = new Slim\Container(array_merge_recursive( require 'config/slim.php', require 'config/db.php' )); $app = new Slim\App($container); $app->get('/posts', [PostsController::class, 'index']); $app->get('/posts/{slug}', [PostsController::class, 'show']); $app->run(); И всё работает. Без синглтонов и статики. Смог.
А что там интересного? Потенциальное неиспользование реализуется lazy-сервисами для отложенного подключения.
Нарисовал тестируемый код без лапшекодного смешения ответственностей, синглтонов и статики. Проверяй, солнышко наше ясное.
Я думаю что гораздо лучше использовать конструкцию типа Код (Text): require_once($_SERVER[DOCUMENT_ROOT]."/cfg/config.php"); или же (что гораздо удобнее будет в дальнейшем) конструкцию типа: Код (Text): define ("CFGPATH", $_SERVER[DOCUMENT_ROOT].'/cfg/'); и далее в нужном месте: Код (Text): include CFGPATH."config.php";
Про то, что ты написал после. нафига оно тут ? если у автора обвертка, которую я оптимизировал без всякого дополнительного кода и сделал ее ( повторяться не буду, выше писал два раза ).
тут даже не в деле "люблю или нет". Конкретную ситуацию учитывай и исходя от нее выводи код без "лишнего".
По поводу Вашего кодя я ничего не сказал, я лишь имел ввиду, что у автора идет подключение внешнего файла относительного текущего. Я предложил подключение относительно корня сайта (тогда где бы не находилось подключение ссылка будет работать). А по поводу функции define, то использование ее скажем в конфигурации сайта как определение именованных констант (например для задания пути на определенные каталоги как то: images, css, js и т.д.) является на мой взгляд предпочтительнее.
DOCUMENT_ROOT не прокатит, так как входные скрипты для web, console и запуска тестов могут быть в разных папках. Так что при необходимости абсолютных путей используйте константу __DIR__. А при указании относительных путей во всех точках входа укажите корневую директорию проекта через chdir(dirname(__DIR__));
Создал для нужного мне теста в корне config.php с данными по структуре похожими как и в конфиге бд. Так что мне удумал сайт, он взял при выводе постов когда вызывается подключение к бд, подключил config из корня сайта да еще и закешировал хитро, что если удалить все равно он работает. Вот задумался путь надо прописывать как то полней. Или вот вопрос, а что плохого если конфиг бд, просто всунуть в класс подключения к бд?
да, но тут то не в этом дело а то что если в классе $config = require_once 'config.php'; и создать в корне сайта файл config.php то он его может подключить вместо, который в корне класса. Сделал вот так: PHP: private function config() { return [ 'host' => 'localhost', 'db_name' => 'users', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ]; } private function connect() { $config = $this -> config();
я обычно использую вот такой класс PHP: class MyDB { var $dblogin = "root"; // ЛОГИН К БАЗЕ ДАННЫХ var $dbpass = "pass"; // ПАРОЛЬ К БАЗЕ ДАННЫХ var $db = "dbname"; // НАЗВАНИЕ БАЗЫ var $dbhost="host"; var $link; var $query; var $err; var $result; var $data; var $fetch; function connect() { $this->link = mysql_connect($this->dbhost, $this->dblogin, $this->dbpass); mysql_select_db($this->db); mysql_query('SET NAMES utf8'); } function close() { mysql_close($this->link); } function run($query) { $this->query = $query; $this->result = mysql_query($this->query, $this->link); $this->err = mysql_error(); } function row() { $this->data = mysql_fetch_assoc($this->result); } function fetch() { while ($this->data = mysql_fetch_assoc($this->result)) { $this->fetch = $this->data; return $this->fetch; } } function stop() { unset($this->data); unset($this->result); unset($this->fetch); unset($this->err); unset($this->query); } } Хочу услышать ваше мнение по этому поводу.
@teanrus Синтаксис php 4, когда на дворе 7.3 - беееееееееее Расширение mysql, устаревшее 6 лет назад - беееееееееее Отсутствие средств для облегчения экранирования - бееееееее
Мне до сих пор интересно что все не увидели ошибку @ElisDN , при написании БД, а точнее метода query. Хотя это мелочь как по мне и при тесте все образуется