/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Noget med klasser og arrays
Fra : Bertel Lund Hansen


Dato : 26-06-05 18:03

Hej alle

Jeg er lidt usikker på hvordan man håndterer klasser og arrays i
PHP. Her er lidt kode som ikke fungerer:

$initfilename = "mininitfil.txt";
$byer = Array();

function read_initfile() {
   GLOBAL $initfilename, $byer;
   $by = new Bytype();
   $filecontent=explode('\n', file_get_contents($initfilename));
   for ($nr=0; $nr<count($filecontent); $nr+=1) {
      $by->navn=$filecontent[$nr];
      array_push($byer,$by);
   }
}

-------- Main --------

read_initfile();
   print count($byer);
   print "<br>\r\n";
   for ($nr=0; $nr<count($byer); $nr+=1) {
      print $byer[$nr]->navn.'<br>';
   }

Det udskriver tallet 1 og derefter hele filindholdet i én lang
streng (med <br> til sidst). Jeg har brugt fidusen med at
eksplodere et filindhold på en anden side hvor det virker fint.

--
Bertel
http://bertel.lundhansen.dk/   Fiduso: http://fiduso.dk/

 
 
Ukendt (26-06-2005)
Kommentar
Fra : Ukendt


Dato : 26-06-05 22:57

Hej Bertel,

> Jeg er lidt usikker på hvordan man håndterer klasser og arrays i
> PHP.

Jeg er tilgengæld lidt usikker på, hvad dit spørgsmål er?

> $initfilename = "mininitfil.txt";
> $byer = Array();
> function read_initfile() {
>    GLOBAL $initfilename, $byer;

Her vil jeg foreslå dig at droppe brugen af globale variable. Det er
sjældent pænt.

I stedet:

function red_initfile( $filnavn )

og kald den med:

read_initfile( "mininitfil.txt" );

>    $by = new Bytype();

Du skriver ikke rigtigt om du arbejder med PHP4 eller PHP5. Arbejder du
med PHP4 skal du være opmærksom på referencer. Dvs. det skal se ud
nogenlunde som følger:

$by =& new Bytype();

(Ja, det er grimt)

>    for ($nr=0; $nr<count($filecontent); $nr+=1) {
>       $by->navn=$filecontent[$nr];

Det er lidt unormal måde at løbe igennem et array på. I en for-løkke vil
man normalt skrive $nr++ og ikke $nr+=1. Gør det til en vane at skrive
det første, da det ellers nemt kan forvirre andre, der skal læse din kode.

En anden måde at gøre det på kunne være at skrive:

while( list($nr, $str) = each($filecontent) ) {
$by->navn = $str;

Noget helt andet er, at det kunne være en idé at lave en set-funktion:

$by->setName( $str )

istedet for

$by->navn = $str

>       array_push($byer,$by);

Denne linje virker lidt mystisk, da du kun new'er et enkelt
Bytype-objekt, men pusher det på listen mange gange.

En omskrivning af det hele ville være:

function readInitfile( $initfilename ) {
$filecontent = explode( '\n', file_get_contents($initfilename) );

$byer = array();
while( list($nr, $str) = each($filecontent) ) {
$by =& new Bytype();
$by->navn = $str;
array_push( $byer, $by );
}

return $byer;
}

> read_initfile();
>    print count($byer);
>    print "<br>\r\n";
>    for ($nr=0; $nr<count($byer); $nr+=1) {
>       print $byer[$nr]->navn.'<br>';
>    }

Selve denne kode vil så omskrives til noget i stil med:

$byer = readInitfile( "mininitfil.txt" );
print "Der er " . count($byer) . " byer i filen<br>\n";
while( list($nr, $by) = each($byer) ) {
print "By $nr hedder " . $by->navn . "<br>\n";
}


--
Jens Kristian Søgaard, Mermaid Consulting ApS,
jens@mermaidconsulting.dk,
http://www.mermaidconsulting.com/
* Virtuelle Linux servere til 100 kr. per måned

Bertel Lund Hansen (27-06-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 27-06-05 09:07

Jens Kristian Søgaard skrev:

> Jeg er tilgengæld lidt usikker på, hvad dit spørgsmål er?

Ja, det forstår jeg godt. Jeg var mere frustreret end klar i
hovedet da jeg skrev det. Jeg opdagede senere at mit primære
problem var at '\n' er to tegn, mens jeg jo mente "\n" som er et
linjeskift.

Imidlertid har du givet mig nogle nyttige kommentarer, så det er
jo fint nok.

> Her vil jeg foreslå dig at droppe brugen af globale variable. Det er
> sjældent pænt.

Det er en gammel uvane som jeg ikke har aflagt helt. Det er
tanken om at det er mere effektivt at et element er globalt
kendt, frem for at det skal overføres til hver eneste funktion,
der gør at jeg ikke slipper vanen helt.

> I stedet:

> function red_initfile( $filnavn )
> og kald den med:
> read_initfile( "mininitfil.txt" );

Ja, filnavnet skal ikke bruges mere, så det kan jeg nemt
afglobalisere, men de forskellige arrays skal bruges ved flere
sammentællinger. Er den rigtige måde så at overføre dem som
parametre hver gang?

>>    $by = new Bytype();

> Du skriver ikke rigtigt om du arbejder med PHP4 eller PHP5.

Næ, for det er ikke noget jeg egentlig forholder mig til. Jeg kan
se at det p.t. er version 4 jeg har adgang til.

> Arbejder du med PHP4 skal du være opmærksom på referencer. Dvs.
> det skal se ud nogenlunde som følger:

> $by =& new Bytype();

Tak for noten. Det vil jeg så være opmærksom på.

>>    for ($nr=0; $nr<count($filecontent); $nr+=1) {
> >       $by->navn=$filecontent[$nr];

> Det er lidt unormal måde at løbe igennem et array på.

Ja. Python har ikke implementeret ++-notationen, og det var det
der foresvævede mig. Nu har jeg rettet det.

> En anden måde at gøre det på kunne være at skrive:

> while( list($nr, $str) = each($filecontent) ) {
> $by->navn = $str;

De der specielle PHP-gennemløb er jeg ikke fortrolig med, så det
er fint at få et tip om det.

> Noget helt andet er, at det kunne være en idé at lave en set-funktion:
> $by->setName( $str )

Det vil jeg overveje.

> $by->navn = $str

>>       array_push($byer,$by);

> Denne linje virker lidt mystisk, da du kun new'er et enkelt
> Bytype-objekt, men pusher det på listen mange gange.

Det er måske også forkert (det kommer an på hvordan PHP håndterer
sådan et push), men nu har jeg også ændret det til at jeg bare
pusher new Bytype("Bynavn"), og jeg har lavet den nødvendige
konstruktør - altså uden en temp-variabel.

--
Bertel
http://bertel.lundhansen.dk/   Fiduso: http://fiduso.dk/

Jacob Atzen (27-06-2005)
Kommentar
Fra : Jacob Atzen


Dato : 27-06-05 10:05

On 2005-06-27, Bertel Lund Hansen <nospamfilius@lundhansen.dk> wrote:
> Ja, filnavnet skal ikke bruges mere, så det kan jeg nemt
> afglobalisere, men de forskellige arrays skal bruges ved flere
> sammentællinger. Er den rigtige måde så at overføre dem som parametre
> hver gang?

Globale variable er noget man bør undgå i absolut videst muligt omfang.
Det gør det meget sværere at overskue et program og ligeledes at finde
fejl i det. Så ja, jeg ville overføre dine array's til funktionerne,
alternativt kan du måske returnere et nyt array fra funktionen og så
merge de to arrays bagefter.

>> En anden måde at gøre det på kunne være at skrive:
>
>> while( list($nr, $str) = each($filecontent) ) {

Alternativt kan man bruge:

foreach($filecontent as $nr => $str) {

Det synes jeg personligt er lettere at læse.

--
Med venlig hilsen
- Jacob Atzen

Geert Lund (27-06-2005)
Kommentar
Fra : Geert Lund


Dato : 27-06-05 12:57

Jens Kristian Søgaard wrote:

> Det er lidt unormal måde at løbe igennem et array på. I en for-løkke vil
> man normalt skrive $nr++ og ikke $nr+=1. Gør det til en vane at skrive
> det første, da det ellers nemt kan forvirre andre, der skal læse din kode.
>
> En anden måde at gøre det på kunne være at skrive:
>
> while( list($nr, $str) = each($filecontent) ) {
> $by->navn = $str;

[...]

> $byer = readInitfile( "mininitfil.txt" );
> print "Der er " . count($byer) . " byer i filen<br>\n";
> while( list($nr, $by) = each($byer) ) {
> print "By $nr hedder " . $by->navn . "<br>\n";
> }
>

Derudover skal man ved brugen af while ... each sætningen altid huske at
køre en

   reset( array );

inden while loopet da man ellers ikke kan være sikker på hvor PHPs
interne pointer står i arrayet og derfor ikke altid vil få det
forventede resultat.

(derfor er foreach som Jacob Atzen har foreslået generelt en bedre
metode, da foreach altid spoler pointeren tilbage til første element i
arrayet).



--
Med venlig hilsen
Geert Lund

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408928
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste