Форум программистов, компьютерный форум, киберфорум
PHP: ООП
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 28.04.2017
Сообщений: 17

Взаимодействие классов

01.07.2018, 00:39. Показов 852. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Только начинаю разбираться во всём этом, поэтому вопрос возможно глупый, но за пол дня сам решения не нашел

Есть файл index.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
session_start();
 
require_once('app/route.php');
 
$route = new Route;
$route->run();
 
require_once('app/db_connect.php');
 
$db = new DB;
$db->connect();
?>
Далее есть файл db_connect.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class DB {
 
    protected $connection;
 
    public function сonnect() {
        $this->connection = new mysqli("localhost", "root", "", "mos_db");
 
        if(!$this->connection) {
            throw new Exception("Connect error");
        }
 
        return $this->connection;
    }
 
}
?>
Роутер подключает нужные файлы / методы, он работает. Проблема в том, что в файле, например, app/user.php имея данный код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class User {
 
    public function getUsers() {
        $result = array();
        
        $res = $this->connection->query("SELECT * FROM `users`");
        while($row = $res->fetch_assoc()) {
            $result[] = $row;
        }
 
        return $result;
    }
 
}
?>
Он не работает, вызывая ошибку:
Fatal error: Call to a member function query() on a non-object in O:\OpenServer\domains\devoop\app\user.ph p on line 17

Но если этот же код записать в файл db_connect.php, то он отрабатывает.
Что не так?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.07.2018, 00:39
Ответы с готовыми решениями:

взаимодействие классов
Всем добрый вечер. Начал изучать ооп в php и столкнулся с проблемой: Как из класса 1 обратится к методу класса 2, не делая этот метод...

ООП, взаимодействие объектов классов
Всем привет! Перед тем как задавать вопросы напишу. Я понимаю концепцию ООП, понимаю чем отличается класс от объекта класса, знаю что...

Взаимодействие классов БД, Модель, Класс от модели (принцип ООП)
Помогите пожалуйста сориентироваться в вопросе (пишу свой движок) И есть недопонимание, так сказать, сомнение У меня есть класс БД, с...

7
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
01.07.2018, 01:03
Не определено свойство connection у объектов класса User
0
0 / 0 / 1
Регистрация: 28.04.2017
Сообщений: 17
01.07.2018, 01:22  [ТС]
И как это исправить?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
01.07.2018, 11:31
Цитата Сообщение от Лафилл Посмотреть сообщение
И как это исправить?
Определить свойство connection перед использованием
0
 Аватар для php10
146 / 105 / 44
Регистрация: 30.04.2016
Сообщений: 550
01.07.2018, 13:29
Передавайте в конструктор класса User экземпляр класса Db, который у вас на минуту должен быть один на все ваше приложение.
PHP
1
2
3
4
5
6
7
class User
{
   public function __construct(ConnectionInterface $db)
   {
 
   }
}
Немного перепишите Db, чтобы он возвращал Connection.
PHP
1
2
3
4
interface ConnectionInterface
{
    public function getConnection();
}
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class DB implements ConnectionInterface 
{
 
    protected $connection;
 
    public function __construct()
    {
        $this->connection = new mysqli("localhost", "root", "", "mos_db");
 
        if(!$this->connection) {
            throw new Exception("Connect error");
        }
 
        return $this->connection;
    }
   
    public function getConnection()
    {
        return $this->connection;
    }
}
?>
Хотя мой код выше также с запашком, но суть вы должны уловить. Если нет - почитайте про ООП.
1
 Аватар для tarasalk
1992 / 1216 / 440
Регистрация: 13.06.2013
Сообщений: 4,115
01.07.2018, 22:22
Вряд ли у ТС есть IoC-контейнер, а вручную внедрять зависимости это жесть, тем более что в конечном итоге мы просто получаем объект mysqli.
Я бы на его месте сделал обычный синглтон.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class DB
{
    private static $instance = null;
 
    public static function connection()
    {
        if (null === self::$instance)
        {
            self::$instance = new mysqli("localhost", "root", "", "mos_db");;
        }
        
        return self::$instance;
    }
    
    private function __clone() {}
    private function __construct() {}
}
 
class Entity {
    private $connection;
    
    public function __construct() {
        $this->connection = DB::connection();
    }
}
 
class User extends Entity {
 
    public function getUsers() {
        $result = array();
        
        $res = $this->connection->query("SELECT * FROM `users`");
        while($row = $res->fetch_assoc()) {
            $result[] = $row;
        }
 
        return $result;
    }
 
}
PHP
1
 
1
21 / 44 / 11
Регистрация: 08.02.2018
Сообщений: 443
06.07.2018, 23:29
Не определено свойство connection в классе User, я бы на вашем месте унаследовал бы класс DB, ведь они оба работают с БД.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
06.07.2018, 23:39
Цитата Сообщение от maxoun Посмотреть сообщение
я бы на вашем месте унаследовал бы класс DB, ведь они оба работают с БД
Вредные советы
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.07.2018, 23:39
Помогаю со студенческими работами здесь

Как добавить взаимодействие классов в диаграмму классов?
Нужна диаграмма классов для пояснительной записки вот такого вида Диаграмма классов которую генерирует visual studio 2012 ...

Взаимодействие классов
Допустим, в первом классе у нас объявлена какая-либо переменная, например проинициализированная строка, объявленная в секции private. Как в...

Взаимодействие классов
Делаю игрушку в консоли, но не знаю как сделать адекватное взаимодействие между персонажами. У меня есть два класса, каждый после...

Взаимодействие классов
Помогите решить задание. Создать 4 класса: книга, печатное издание, учебник и журнал. У каждого есть по 2 свойства. У классов есть...

Взаимодействие классов
Решил потренироваться и написать &quot;игру&quot;. Есть класс игрок и класс бот. Как наладить их взаимодействие? З.Ы. да, я знаю, что в классах нет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru