Wywołanie obiektu w klasie

0

Cześć, potrzebuję rozwiązania swojego problemu.

Mam dwa obiekty utworzone na podstawie dwóch różnych klas.

$appdb = new APPDB(host, user, pass, bd);

Służy do obsługi bazy danych, w konstruktorze przyjmuje informacje dla połączenia oraz wywołuje mysqli_connect(params);
Ten obiekt posiada także metodę public query($query), która wywołuje funkcję mysqli_query($query) oraz zwraca opcjonalnie tablicę asocjacyjną.
Mówiąc krótko - ten obiekt jest odpowiedzialny za wszelkie operacje z bazą danych.

$user = new User;

Ten obiekt służy do obsługi użytkownika. I tutaj pojawia się mój problem.
Obiekt User posiada metodę public updatetime(). Jest to metoda, która po wywołaniu powinna aktualizować pole 'time' w bazie danych dla rekordu danego użytkownika.

Jak zatem zagnieździć obiekt $appdb w klasie User, aby metoda updatetime(); mogła zaktualizować te dane?

0

Poszukaj informacji o Dependency Injection, albo umożliw pobranie ostatnio utworzonej instancji bazy.

0
<?php
class User {
private $dbOne;
private $dbToo;
public function __construct() {
$this->dbOne = mysqli_connect(); //...

if(!$this->dbOne) {
się("błąd połączenia");
}
}

public function updateTime() {
return mysqli_query($this->dbOne,"UPDATE ...");
}
}

0
Wesoły Ogrodnik napisał(a):
<?php
class User {
private $dbOne;
private $dbToo;
public function __construct() {
$this->dbOne = mysqli_connect(); //...

if(!$this->dbOne) {
się("błąd połączenia");
}
}

public function updateTime() {
return mysqli_query($this->dbOne,"UPDATE ...");
}
}

Miało być die a nie się. Autokorekta (v-v)

0

Wygląda na to, że to będzie to. Jeszcze pytanie kontrolne co do tego tematu.

Załóżmy, że mam taki kod:

$appdb = new APPDB(host, user, pass, bd); // nawiązywanie połączenia z bazą
$user = new User($appdb); // tworzenie obiektu user i przyjęcie połączenia

Dobra. Jak widać - połączenie (obiekt new APPDB) zostaje przekazane przez konstruktor klasy User. Wewnątrz stosuję np. $this->appdb->query();
Zależy mi, aby konstruktor klasy User przyjmował inne wartości. Czy jest możliwe przekazanie obiektu APPDB przez metodę klasy User?

$appdb = new APPDB(host, user, pass, bd); // nawiązywanie połączenia z bazą
$user = new User(params); // obiekt User
$user->db($appdb); // przejęcie przez metodę

Pytam dlatego, że przez pewien czas nie będzie mnie przy komputerze, a chciałbym się przygotować merytorycznie już.

0
<?php
class User {
private $dbOne;
private $dbToo;
public function __construct($val1, $val2, $val3) {
$this->dbOne = mysqli_connect(); //...
 
if(!$this->dbOne) {
die("błąd połączenia");
}
}
 
public function updateTime() {
return mysqli_query($this->dbOne,"UPDATE ...");
}
}
?>
0
PiDev napisał(a):
<?php
class User {
private $dbOne;
private $dbToo;
public function __construct($val1, $val2, $val3) {
$this->dbOne = mysqli_connect(); //...
 
if(!$this->dbOne) {
die("błąd połączenia");
}
}
 
public function updateTime() {
return mysqli_query($this->dbOne,"UPDATE ...");
}
}
?>

Twoje rozwiązanie zadziała oczywiście, jednak potrzebuję mieć odrębną klasę do obsługi bazy danych.

Rozwiązanie zaproponowane przez @mefsh jest najbliższe rozwiązaniu akurat mojego problemu. Myślałem także nad użyciem rozszerzenia klasy APPDB o User:

class User extends APPDB {
metody klasy User wykorzystujące metody klasy APPDB
}
0

$appdb = new APPDB(host, user, pass, bd); // nawiązywanie połączenia z bazą
$user = new User(params); // obiekt User
$user->db($appdb); // przejęcie przez metodę

Możesz przekazać w metodzie obiekt, aczkolwiek wtedy musiałbyś każdej metodzie wymagającej połączenia z bazą przekazywać go.
Dużo lepiej byłoby po prostu wykorzystać DI z settera.

protected $db = null;

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

W rzeczywistości byłoby lepiej gdybyś dodał sobie interfejs który implementuje Twoja klasa APPDB, i w setDb zamiast APPDB wstawił ten interfejs.

1 użytkowników online, w tym zalogowanych: 0, gości: 1