LINUX.ORG.RU

Вопросик по php ))

 


0

2

Не совсем правильно изначально спроектировал проект(сайт) и столкнулся с проблемой БД.
Скелет такой

//app.lib.php
class app{
    function init(){
        $this->db = new db();
    }
}

//db.lib.php
class db{
    function __construct(){
        $this->mysqli = new mysqli();
    }
    
    function query($sql){
        return $this->mysqli->query($sql);
    }
}

//class1.lib.php
class class1{
    function __construct(){
        global $app;
        $app->db->query("select ...");
    }
}

//class2.lib.php
class class2{
    function __construct(){
        global $app;
        $app->db->query("select ...");
    }
}

//index.php
global $app;

//instance 1
$app = new app();
$app->init();

new class1();
new class2();



Все хорошо было, когда создаешь 1 экземпляр приложения(new $app), но мне понадобилось создавать много этих экземпляров для websocket'ов. Одно сообщение(onMessage) - 1 экземпляр приложения app(). Это нужно для создания нового коннекта с БД. Но функции внутрях классов дергают глобальный объект $app который постоянно меняется в коде

Делаю через pthread
//websocket.lib.php
class websocket{
    public function onMessage($conn, $msg) {
        $mess = new Message();
        $mess->start();
    }
}


namespace messages;
class Message extends \Thread {
    public function __construct($opt = []){
        $app = new \app();
        $app->init();
    }

    public function run(){
        new class1();
    }
}


Получается $app->db->mysqli будет постоянно меняться внутрях

★★★★

1. Избавься от глобалов, а именно не использовать это никогда
2. Если слишком уж нужен единственный инстанс используй антипаттерн синглтон
3. Возможно здесь все же лучше будет передать $app в конструктор

kiotoze ★★★★
()
Ответ на: комментарий от gobot

Это нужно с 0 все переписывать

Ну у ж и с нуля... Всего-то надо передавать app в class1 параметром конструктора.

все переписывать

Поздравляю, ты постиг дзен разработки.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Всего-то надо передавать app в class1

Много их, да и неудобно таскать постоянно

gobot ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.