Avatar billede bmdk Nybegynder
26. juli 2008 - 20:55 Der er 13 kommentarer og
1 løsning

Objekter i array

Hey eksperter,

Jeg har kodet i Java i godt et års tid nu og er nu på vej til at kaste mig ud i objekt orienteret PHP.

Kan nogen af jer måske fortælle mig, hvordan man lagre flere objekter i en arrayliste? F.eks., hvis jeg nu vil oprette 3 forskellige objekter af klassen "Member" og ligge dem i en arrayliste, hvordan gør jeg det?

Jeg har selv været ved at rode med noget og kan udmærket godt få lavet et objekt og puttet det ind i array'et, men når jeg vil oprette et member-objekt mere, så bliver det åbenbart bare overskrevet. Er det fordi arrayet skal ligge som en session, eller?

Mit slamkode ;)

INDEX.php

<?php
session_start();
include("member.php");
include("memberContainer.php");
  $name = $_POST[navn];
  $address = $_POST[adresse];
  $phone = $_POST[tlf];
  $memberList = array();
 
  echo "
    <form action=index.php method=post>
      Indtast navn:<input type=text name=navn><br />
      Indtast adresse:<input type=text name=adresse><br />
      Indtast tlf:<input type=text name=tlf><br />
      <input type=\"submit\" value=\"submit\" name=\"submit\">
  </form>
  ";
 
  if(isset($_POST['submit'])) {
    $member = new member($name, $address, $phone);
    $memberList[] = $member;
    echo count($memberList);
  }

?>

Member.php

<?php

class member {
 
  var $navn;
  var $adresse;
  var $tlf;
 
  function __construct($navn, $adresse, $tlf) {
    $this->navn = $navn;
    $this->adresse = $adresse;
    $this->tlf = $tlf;
  }
 
  function setNavn($navn) {
    $this->navn = $navn;
  }
 
  function getNavn() {
    return $this->navn;
  }
 
  function setAdresse($adresse) {
    $this->adresse = $adresse;
  }
 
  function getAdresse() {
    return $this->adresse;
  }
 
  function setTlf($tlf) {
    $this->tlf = $tlf;
  }
 
  function getTlf() {
    return $this->tlf;
  }
}

?>

På forhånd mange tak!
Avatar billede bmdk Nybegynder
26. juli 2008 - 20:56 #1
Se bort fra include("memberContainer.php"), den havde jeg glemt at slette fra tidligere eksperimenter ;)
Avatar billede erikjacobsen Ekspert
26. juli 2008 - 20:56 #2
"Er det fordi arrayet skal ligge som en session" - ja, det er en mulighed. Variabler på en PHP side eksisterer kun så længe siden behandles.
Avatar billede bmdk Nybegynder
26. juli 2008 - 21:07 #3
Oki :) tak for det!

Hvilke muligheder har man ellers? Nu nævner du at det er én mulighed hehe.
Avatar billede bmdk Nybegynder
26. juli 2008 - 21:11 #4
Hmm, det virker bare heller ikke desværre :(

Har lavet det sådan her (sikkert forkert dog):

  $_SESSION[memberList] = array();
 
  echo "
    <form action=index.php method=post>
      Indtast navn:<input type=text name=navn><br />
      Indtast adresse:<input type=text name=adresse><br />
      Indtast tlf:<input type=text name=tlf><br />
      <input type=\"submit\" value=\"submit\" name=\"submit\">
  </form>
  ";
 
  if(isset($_POST['submit'])) {
    $member = new member($name, $address, $phone);
    $_SESSION[memberList][] = $member;
    echo count($_SESSION[memberList]);
  }
Avatar billede erikjacobsen Ekspert
26. juli 2008 - 21:31 #5
Du sætter et tomt array ind i din session-variabel. Så starter du forfra hver gang.

Det ender jo typisk med at man smider alt i en database - det er li'som en anden mulighed.
Avatar billede nicklasb Nybegynder
26. juli 2008 - 21:48 #6
Eventuelt kan du ændre

$_SESSION[memberList] = array();

til

if (!isset($_SESSION[memberList]) || !is_array($_SESSION[memberList]))
    $_SESSION[memberList] = array();

Men som sagt er det kun på sessions-niveau, de objekter du opretter. Da PHP kun lever mellem sidevisninger, giver det nok mest mening enten at smide det i en memcache eller en database.

Og så skal du have styr på din indeksering af arrayet. Enten skal du definere hvad memberList er, eller også skal du have nogle gåseøjne om, så det er strengen "memberList".

Altså; enten er det

define('memberList', 'foobar');
// Koden ovenfor

eller

if (!isset($_SESSION['memberList']) || !is_array($_SESSION['memberList']))
    $_SESSION['memberList'] = array();
// osv..
Avatar billede nicklasb Nybegynder
26. juli 2008 - 21:53 #7
.. og nu ligner det nu mest, at det rent faktisk er strengen "memberList" du ønsker som indeks. Men i tilfælde af, at det skulle være en konstant, er der ligesom for Java en mere eller mindre uskreven konventions-regel der bestemmer at konstanter (som i Java bedst kan sammenlignes med final-stemplede variable) skrives med store bogstaver.
Det er en god idé at følge sådanne regler, selv om det ikke betyder noget, når først scriptet kører - men vil du gøre dig en forhåbning om, at andre kan læse din kode, er det pænest at "fastslå" hvad der er konstanter (selv om variable allerede udskiller sig ved at have $-tegnet foran).
Avatar billede bmdk Nybegynder
26. juli 2008 - 21:57 #8
Nicklasb:

Mange tak! :) jeg satte dette ind:

if (!isset($_SESSION[memberList]) || !is_array($_SESSION[memberList]))
    $_SESSION[memberList] = array();

og det virker perfekt nu!

Forstår bare ikke, hvad forskellen er :S du siger, at hvis sessionen variablen ikke er sat og hvis den ikke er et array, så skal den sættes til at være et array.

Hvorfor kan man ikke bare gøre som jeg gjorde? $_SESSION[memberList] = array();
Avatar billede erikjacobsen Ekspert
26. juli 2008 - 22:13 #9
Så sker det hver gang du går ind på siden. Dvs du overskriver det der stod i sessions-variablen, og får max 1 element i listen.
Avatar billede nicklasb Nybegynder
26. juli 2008 - 22:48 #10
Som Erik siger det, bliver koden læst fra oven og ned, hver gang siden kaldes. Når du i koden når til linjen

$_SESSION['memberList'] = array();

vil den gøre nøjagtigt hvad der står - altså sætte variablen lig et tomt array. Så vidt jeg kan forstå har du tidligere programmeret Java(?)
Det vil svare lidt til, at du i Java lavede en

class ... {
  private List<Member> memberList;
...

og i stedet for blot at sætte den i "public ...", gjorde noget lignende

public void refreshPage() {
    memberList = new ArrayList();
    memberList.add(...)...
    ...
}

hvor refreshPage kaldes hver gang der skal oprettes et nyt Member-objekt.

---

Det if-sætningen foreskriver, er blot at variablen kun skal initialiseres til den tomme liste, hvis ikke den allerede er en liste i forvejen. Grunden til !isset(...) foran, er at du ikke kan "teste" på en variabel der slet ikke findes. Til sammenligning er det ikke tilladt at skrive

echo $foo;

hvis ikke $foo er sat forinden. Så samlet set spørger jeg blot, "hvis der ikke i forvejen er nævnt noget om en liste ved navn memberList, ELLER hvis der findes en variabel med navn memberList, men som ikke er en liste - da skal listen oprettes".

Du kunne undvære den sidste del (efter ELLER), så der blot står

if (!isset($_SESSION['memberList']))
    ....

Da er det dog lidt usikkert hvad der sker, hvis du andet steds i koden, har fået sat memberList variablen til noget andet end et array, når du senere sætter elementer i arrayet.

En lidt lang forklaring - giver det mening?
Avatar billede bmdk Nybegynder
26. juli 2008 - 23:29 #11
Selvfølgelig - det er jo logik :) tror varmen har spillet mig et pus der hhehe ;)

Mange tak for hjælpen begge to! Hvem skal have points osv? :o
Avatar billede erikjacobsen Ekspert
26. juli 2008 - 23:50 #12
Ingen point til mig, tak.
Avatar billede bmdk Nybegynder
27. juli 2008 - 01:37 #13
Oki :) Niklas, smider du et svar så?
Avatar billede nicklasb Nybegynder
27. juli 2008 - 10:15 #14
Jah, kan jeg da godt..
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