Подключение файлов в PHP множество раз

147
25 марта 2019, 19:20

Всем доброго времени суток. Я тут делаю плохую штуку. Хочу реализовать попробовать MVC паттерн. Как сделать так чтобы когда подключаеш файлы с классами через инклуд все что нужно доходило до конечного файла. Ниже приведу пример как примерно у меня что подключается и там уже будет видно. Накидаю простую схему.

'index.php'
|-include 'settings.php'  
|-include 'tbl_name.php'  
|-include 'db.php'     +-include uris.php  +---или---include 'views1.php'
+-include 'router.php--|-------------------|---или---include 'views2.php'
                                           +---или---include 'views3.php'

Объясню, в index.php поключаются 4 файла

  1. settings (тут хранятся все переменные за которые можно дернуть и изменить что то чтобы не ковырять весь код)
  2. db.php (содержит класс в котором при помощи коструктора идет подключение к бд и там создаются таблицы и столбы которые были указанны в файле tbl_name.php и описанны несколько методов для работы с бд, создавать записи в определенную таблицу ну и получать результат из нужной нам таблицы, смотря что хотим получить)
  3. router.php (вот тут самое интересное, роутер читает заголовки и читает что мол написано в адресной строке и в зависимости что там написано открывает определенный шаблон страницы и из файла views1 или views2 или views3 берет нужную нам функцию и передает ее в наш шаблон страницы)

Так вот проблема заключается в том, в файлах views.php я не могу объявить методы из файла db.php, как и в принципе и переменные (не глобальные) если указать через define(name, value) то все с переменными проблемы нет но там даже не могу создать экземпляр класса. Допустим нужно мне переменную из settings.php использовать в файле views1.php в функции home() а там ее нет, область видимости переменных не работает уже тут. Как сделать чтобы я мог использовать класс бд в файлах которые не по разу подключаются а в них еще файлы подключаются по нескольку раз.

Fatal error:  Uncaught Error: Call to a member function get_table_data() 
on null in xxx\engine\handlers\views.php:6
Stack trace:
           //это выззиывается метод из views.php
#0         xxx\engine\router.php(38): home() 
           //запускаем маршрутизатор
#1         xxx\index.php(14): Router->run()
#2         {main}
thrown in  xxx\engine\handlers\views.php on line 6

тут он ругается на метод в файле views.php в 6 строке, который я использую из файла db.php где реализован класс для работы с бд про который я писал выше. Да и еще чуть не забыл, знаю что можно сделать глобальную переменную мол global или $GLOBALS['<имя_переменной>'] так и сделал пока на данный момент, просто хочется вехать в суть. Получится это или нет. а то хотел с помощью сессии уже сделать но не охота дергать за эти нитки.

Пример кода... db.php

<?php 
class DataBases{ 
    function __construct($host, $port, $dbname, $db_user, $db_user_pass, $create_table_array){ 
        $this->db_connect = new PDO('mysql:host='.$host.'; port='.$port.'; dbname='.$dbname, $db_user, $db_user_pass);
        ...
       } 
    public function set_table($create_table_array){...} 
    public function set_table_data($table_name, $table_data){...} 
    public function get_table_data($select_table_name, $select_column, $where, $order, $sort_order, $limit){...} 
}
$db = new DataBases($host, $port, $dbname, $db_user, $db_user_pass, $create_table_array) ?>

views.php

<?php
function home(){
    $home_res = $db->get_table_data('comments', array('id', 'name', 'last_name'), array('name' => 'anton'), array('id'), -1, 1);
    return array('header' => 'функция HOME исправно работает',
                 'title' => 'Следующее значени для массива',
                 'title2' => 'И еще одно значение',
                 'home_res' => $home_res,
            );
};
?>

в данном случае ошибка

Fatal error:  Uncaught Error: Call to a member function get_table_data() 
on null in xxx\engine\handlers\views.php:3
Stack trace:
           //это выззиывается метод из views.php
#0         xxx\engine\router.php(38): home() 
           //запускаем маршрутизатор
#1         xxx\index.php(14): Router->run()
#2         {main}
thrown in  xxx\engine\handlers\views.php on line 3

добавил правильную схему выше как все подключается. Прошу прощения у тех, кого ввел в заблуждения.

Answer 1

Не работает просто потому что у тебя $db не определено нигде. У тебя это глобальная переменная и должна быть определена в функциях. Надо добавить global $db в начало функции. А лучше сделать некий родительский класс для всех контроллеров. Я так понял view у тебя как раз и будут контроллерами, как в джанго том же они по сути контроллеры. В этом родительском классе, где то в конструкторе или методе инициализации, сделать подключение к БД. И db сделать уже свойством класса. Свойство сделать либо статическим, чтобы во всех наследниках оно было одно и то же доступно. Сам класс DataBases лучше сделать синглтоном, чтобы соединения к БД было одно на все приложение.

READ ALSO
PHP | Запрос по типу Callback API к php скрипту

PHP | Запрос по типу Callback API к php скрипту

Как сделать вот такой запрос от одного php скрипта к другому на моём хостинге?

193
Как сделать постраничный вывод файлов?

Как сделать постраничный вывод файлов?

Как сделать постраничный вывод файлов? Здравствуйте помогите сделать постраничный вывод файловВсе файлы одинаково записаны

167
Как исключить пустые выводы файлов?

Как исключить пустые выводы файлов?

Здравствуйте сделал постраничный вывод файлов и вот например задано по скажем 10 файлов на страницу а файлов например 13 выводятся пустые...

133