Avatar billede skooter Nybegynder
26. februar 2006 - 20:54 Der er 16 kommentarer og
1 løsning

Objekt på tværs af filer? (PHP5)

Hej
Jeg har rodet lidt med en mysql-klasse jeg har bikset sammen. Jeg kunne godt tænke mig at undgå alt for mange "opkald" til databasen. Så hvordan undgår man det? Ja, i hvert fald ikke sådan her ...

----- Klasse-fil ----
class Db {
  // SQL-metode her ...
}
class User {
  // Metode der finder brugerens navn i databasen via en ID
  function name($id) {
      $obj_db->Query("SQL HER"); // <<--- Kan man ikke :(
  }
}
---------------------



---- Objekt-fil -----
include("klasse-fil");

$obj_db = new Db;
$obj_db->Open();

$obj_user = new User;
print $obj_user->name;

$obj_db->Close();
---------------------

... Det er jo ikke muligt at lave objektet i den ene fil og bruge den i den anden...
Avatar billede fixxxer Nybegynder
27. februar 2006 - 10:11 #1
Hvis jeg læser rigtigt forsøger du i din klassefil at kalde en anden klasse uden først at oprette en instance af denne..

class User {
  // Metode der finder brugerens navn i databasen via en ID
  function name($id) {
      $obj_db = new Db;
      $obj_db->Query("SQL HER"); // <<--- Kan man ikke :(
  }
}
Avatar billede skooter Nybegynder
27. februar 2006 - 10:22 #2
Det er fuldstændig korrekt. Det var også meningen... Hvis jeg opretter en ny instans i metoden "name" så er jeg jo lige vidt. Det ville jo betyde at jeg i klassen "Db" skulle lave en metode der så sådan ud...

function __construct() {
  // Åben mysql forbindelse her...
}

Og hvis jeg så bruger metoden "name" lad os sige 10 gange i objekt-filen så har jeg pludselig 10 gange opkald til databasen. Det må da kunne reduceres... ?
Avatar billede fixxxer Nybegynder
27. februar 2006 - 10:31 #3
På hvilken magisk måde?

Hvis du skal udføre 10 kald til databasen, bliver du vel nødt til at udføre 10 kald til database?

Mht. oprettelse af et link til databasen, kan du sagtens nøjes med at gøre dette en gang, da en mysql_query og lignende kald, automatisk kigger efter et allerede åbent link til databasen..
Hvis det er sådan at du ønsker at undgå at oprette et nyt link, for hver query du afvikler?
Avatar billede skooter Nybegynder
27. februar 2006 - 11:36 #4
Ja et link...

Hvis jeg gør som du skriver får jeg denne fejl ...
"Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource ..."

Også selv om jeg sender linket med, fx.:

$obj_user = new User;
$obj_user->dothis($obj_db->link);


I metoden "User" skriver jeg sådan:

class User {
  function dothis($link) {
      $obj_db = new DB;
      $obj_db->Query("SELECT * FROM Table_users, $link);
  }
}
Avatar billede skooter Nybegynder
27. februar 2006 - 11:38 #5
Hov... SQL-linjen skulle se sådan ud:
$obj_db->Query("SELECT * FROM Table_users", $link);
Avatar billede fixxxer Nybegynder
27. februar 2006 - 11:50 #6
Hvis du i det globale scoop opretter et link til databasen, og efterfølgerne kalder en mysql_query uden at angive link, hvad sker der så?
Avatar billede skooter Nybegynder
27. februar 2006 - 11:59 #7
Så får jeg ingen advarsler og den udskriver de data den skal.
Avatar billede fixxxer Nybegynder
27. februar 2006 - 12:42 #8
Ok, så kan jeg desværre ikke hjælpe dig..

Der er jo nogle rimeligt væsentlige forskellige i OOP miljøet i PHP5, der skulle være noget læsestof om det på www.php.net
Avatar billede skooter Nybegynder
27. februar 2006 - 12:51 #9
Dvs. jeg er nød til at gøre det "The old fasion way" :S
Avatar billede skooter Nybegynder
27. februar 2006 - 13:25 #10
Avatar billede coderdk Praktikant
27. februar 2006 - 14:02 #11
Hvad med at nedarve?

class DB
{
  // SQL metode
}

class User extends DB
{
  function name($id) {
      $this->Query("SQL HER");
  }
}
Avatar billede coderdk Praktikant
27. februar 2006 - 14:06 #12
Du kan lave en slags "caching":

class User extends DB
{
  private $envar = null;
  function getEnvar() {
      if ( !is_null( $this->envar ) )
      {
        return $this->envar;
      }
      else
      {
        // hent envar fra db og sæt $this->envar
      }
  }
}

Har jeg misforstået noget? :)
Avatar billede skooter Nybegynder
27. februar 2006 - 14:11 #13
Ja man kunne også lade den nedarve... Jeg tror jeg har fundet fejlen. I min Query-metode skrev jeg:

$res = mysql_query("SQL HER", $this->link);

Der skulle bare have stået:

$res = mysql_query("SQL HER");

Takker for alt hjælpen. Vil i have 50/50 point?
Avatar billede coderdk Praktikant
27. februar 2006 - 14:15 #14
Nah, ingen til mig, ellers tak :)
Avatar billede fixxxer Nybegynder
27. februar 2006 - 14:17 #15
Jeg svarer gerne..

27/02-2006 11:50:26 beskrev jeg netop løsningen på dit problem.
Avatar billede skooter Nybegynder
27. februar 2006 - 14:27 #16
Godt så... Så var det bare mig der misforstod dit spørgsmål
Avatar billede fixxxer Nybegynder
27. februar 2006 - 14:29 #17
[...] "og efterfølgerne kalder en mysql_query uden at angive link"

Nu kunne jeg jo ikke pege præcist hvor du skulle fjerne denne link henvisning, da du ikke viste den del af dit script.. Men konceptet var beskrevet.

Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester