Всем доброго времени суток. Я тут делаю плохую штуку. Хочу реализовать попробовать 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 файла
Так вот проблема заключается в том, в файлах 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
добавил правильную схему выше как все подключается. Прошу прощения у тех, кого ввел в заблуждения.
Не работает просто потому что у тебя $db не определено нигде. У тебя это глобальная переменная и должна быть определена в функциях. Надо добавить global $db в начало функции. А лучше сделать некий родительский класс для всех контроллеров. Я так понял view у тебя как раз и будут контроллерами, как в джанго том же они по сути контроллеры. В этом родительском классе, где то в конструкторе или методе инициализации, сделать подключение к БД. И db сделать уже свойством класса. Свойство сделать либо статическим, чтобы во всех наследниках оно было одно и то же доступно. Сам класс DataBases лучше сделать синглтоном, чтобы соединения к БД было одно на все приложение.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Как сделать вот такой запрос от одного php скрипта к другому на моём хостинге?
Как сделать постраничный вывод файлов? Здравствуйте помогите сделать постраничный вывод файловВсе файлы одинаково записаны
Здравствуйте сделал постраничный вывод файлов и вот например задано по скажем 10 файлов на страницу а файлов например 13 выводятся пустые...