Avatar billede razmuz_dk Nybegynder
25. august 2006 - 11:42 Der er 5 kommentarer og
1 løsning

Gode råd til user-class

Jeg sidder lidt og fumler med at lave en "user-class" til mit community-site.

Meningen med klassen er simpelthen at kunne håndtere en brugere - fx printe link til brugerens profile, slette brugeren osv.
Jeg vil gerne gøre koden renere alle de steder hvor brugere skal behandles.

Det jeg godt kunne tænke mig lidt "ekspert-input" til, er hvordan klassen skal opsamle oplysninger om brugeren.

Umiddelbart ville det være smart hvis man bare kunne skrive:
---------------------------------------
$user = new user($id); // henter user_id, username fra db
---------------------------------------

Men andre gange ville man måske ønske at hente mere end blot user_id og username fra db'en - måske også "birthday":
---------------------------------------
$user = new user($id, array("username", "birthday"));
---------------------------------------

... men nogle gange er det jo også hensigtsmæssigt at hente mange brugere i ét kald. I sådanne tilfælde kunne det måske se sådan ud:
---------------------------------------
$s = mysql_query("SELECT user_id, username, country_id, profile [...] WHERE group_id = '$group_id'");
while($r = mysql_fetch_assoc($s)) {
  $user = new user($r['user_id'], array("username" => $r['username'], "country_id" => $r['country_id'], "profile" => $r['profile']); // *
  print $user->getLink();
}
---------------------------------------

* = grunden til jeg ikke læsser hele $r-arrayet ind er, at det i nogle tilfælde, vil indeholde data fra andre tabeller hvis der i $s udføres et join på andre tabeller.

En klasse der opfylder ovenstående 3 indlæsningsmetoder kunne se sådan ud:

---------------------------------------
class user {
  private $data;
  function __contruct() {
    $args = func_get_args();
    if(is_numeric(key($args[1])) || sizeof(args) == 1) { // hvis $args[1] er et numerisk array så ...
      $cols = (is_array($args[1])) ? implode(", ", $args[1]) : "username"
      $s = mysql_query("SELECT ".$cols." FROM users WHERE user_id = '".$args[0]."'");
      $data = mysql_fetch_assoc($s);
    } else {
      $data = $args[1];
    }
    $data['user_id'] = $args[0];
    $this->data = $data;
  }
  public function getLink() {
    return "<a href=\"profile.php?user_id=".$this->user_id."\">".$this->username."</a>";
  }
  [...]
}
---------------------------------------

Koden i dette indlæg er ikke testet, men håber i kan se hvad min intention er.

Da jeg er relativ ny i OOP og jeg har en fornemmelse af at jeg gør det hele lidt for avanceret for mig selv. Derfor spørger jeg jer: kan ovenstående løses på en nemmere eller mere struktureret måde? Findes der alternative måder at gøre tingene på, som er bedre? Kort sagt: er ovenstående en god måde at gøre tingene på?

Og så et lille tillægsspørgsmål: Jeg er lige blevet færdig med bogen http://www.bogpriser.dk/isbn-1593270771/?zone_name=ext - og jeg søger nu noget mere udfordrende læsestof omkring OOP gerne med udgangspunkt i PHP. Hvis du kan anbefale en god bog omhandlende dette emne, så ville jeg blive glad :o)

På forhånd tak,
Rasmus
Avatar billede domaz.dk Novice
25. august 2006 - 13:52 #1
kigger lige med...
Avatar billede Slettet bruger
25. august 2006 - 14:24 #2
domaz.dk: Man behøver ikke skrive noget i tekstfeltet for at kigge med. Et klik på send-knappen, mens der er mærke i Abonnér-boksen er nok ;-)

Jeg ville lave det, så constructoren udelukkende klargjorde en "blank" bruger, og så lave metoder til de forskellige typer af indhentning. Det vil både gøre din klasse mere overskuelig og gøre koden, der hvor du bruger klassen mere læselig.

Eventuelt kunne constructoren have en parameter, der giver for at overføre et array med data til at fylde i brugeren. Disse data skulle være et associativt array, så hvis felterne i databasen hedder (eller er aliaset til) det samme som variablene i brugerklassen, skulle det kunne lade sig gøre at bruge resultatet fra mysql_fetch_assoc() direkte.

På den måde ville et objekt kunne oprettes på to måder:

$bruger = new user(); // blank bruger
$bruger = new user( $liste ); // opretter bruger med data

Jeg ville så lave statiske metoder til at hente grupper af brugere.
Avatar billede razmuz_dk Nybegynder
25. august 2006 - 14:36 #3
Sandbox> Tak for din svar. Vil du være venlig at komme med et kode-eksempel på at hente grupper af brugere via statistiske metoder?
Avatar billede Slettet bruger
25. august 2006 - 14:55 #4
public static function Hentbrugere($fosdag = '')
{
  if(empty($fosdag)) $fosdag= time();
  $sql="SELECT * FROM tabel WHERE birthday = DATE(FROM_UNIXTIME({$fosdag}))";
  $res = mysql_query($sql);
  $retur = array(); 
  while($r = mysql_fetch_assoc($res)
  {
    $retur[] = new user($r);
  }
  return $retur;
}

Bruges som

$liste = user::Hentbrugere(); // Henter brugere, der har fødselsdag idag

Og kan også bruges med et timestamp for andre datoer.
Avatar billede razmuz_dk Nybegynder
06. september 2006 - 13:28 #5
Tak for dine forslag. Smid et svar! :)
Avatar billede Slettet bruger
06. september 2006 - 21:06 #6
Javel
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