Autor Zpráva
Acccd
Profil *
Zdravím,
mám 2 triedy - jedna je "ClassUser", ktorá získavá základné údaje z mysql o aktuálne prihlásenom používateľovi ako napríklad login, email, stav apod. Dnes som sa rozhodol vytvoriť si ďalšiu triedu pre jednoduchšiu správu mysql - nazval som ju "MysqlClass".

Iniciujem ich cez:
$db = new MysqlClass();
$user = new ClassUser();

Problém je však keď chcem používať v triede ClassUser príkazy a premenné na správu databázy. Trieda MysqlClass vyzerá v skratke asi takto:

class MysqlClass {
private $host = "";
private $pass = "";
// ...

public $num = 0;
public $error = "";
public $errno = 0;
//...

function __construct() {
//connect
}

function query($query) {
// mysql_query
}

function fetch_array($res) {
// mysql_fetch_array
}
}



A ako by som mohol využiť v triede ClassUser napríklad $db->query() alebo $db->num? Jediné čo ma napadá, je že by som sa v triede ClassUser znovu napojil do databázy, ale to by nebolo veľmi rozumné riešenie, aby sa pri načítaní súboru 2x pripojovalo do jednej databázy.

Vďaka.
joe
Profil
Zápis

$db->query()

by snad měl fungovat nebo ne?

Co zkusit nastavit $db jako globální?

global $db;
joe
Profil
Nebo si udělej třídu pro práci s databází jako statickou třídu.
Acccd
Profil *
config.php:
class classUser {...}
class MysqlClass {...}

index.php:
include(config.php)
global $db;
$db = new MysqlClass();
$user = new ClassUser();


Ani takto to nefunguje. Vždy keď sa snažím použiť v triede MysqlClass premennú $db hlási to "Fatal error: Call to a member function query() on a non-object in XXX/config.php on line 247".

S tou statickou triedou by to šlo ako spraviť?
joe
Profil
Acccd
global $db;

bych napsal do metody, kter $db jako objekt využívá.

Se statickou metodou by to bylo tak, že by jsi měl všechny metody ve třídě MysqlClass statické (static). Navíc v metodě query by jsi kontroloval jestli je připojen, pokud ne, připojíš se na db.

Volání metod by pak bylo

MysqlClass::query();
bukaj
Profil
Acccd
A co prostě a jednoduše (raději než šaškovat s globálními proměnnými, či to celé přepisovat do statické podoby) si uložit instanci MysqlClass jako instanční proměnnou a pracovat s ní?
<?php
class ClassUser
{
    private $db;
    // ... další definované proměnné

    public function setDb(MysqlClass $db)
    {
        $this->db = $db;
    }

    public function nejakaFce()
    {
        // volání na databázi
        $this->db->query(...);
    }
    // ... další definované fce
}


PS. Mimochodem, nedoporučuji ti do jména každé třídy dávat slovo class. Podle mě to nic nepřinese a akorát to prodlužuje názvy.
srigi
Profil
Tak, tak ako pise Bukaj. Este doplnim vytvaranie objektov
$db = new ClasMysql();
$user = new ClassUser();
$user->setDb($db)
.
joe
Profil
či to celé přepisovat do statické podoby
Protože až si rozmyslí, že přidá další třídu, bude muset znovu napsat metodu setDb do každé nové třídy a to mi přijde docela zbytečné.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: