Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

PHP Strict

3 views
Skip to first unread message

J�rn Andersen

unread,
Jan 15, 2013, 10:15:09 AM1/15/13
to
Hej,

Hvis jeg skriver:
echo end(explode("/", $_SERVER["PHP_SELF"]));
- f�r jeg:
PHP Strict Standards: Only variables should be passed by reference

men skriver jeg:
$arrPhpSelf = explode("/", $_SERVER["PHP_SELF"]);
echo end($arrPhpSelf);
- s� er der ingen problemer.

Nu kunne jeg selvf�lgelig bare sl� E_STRICT fra, men eftersom jeg er
ret ny i PHP og gerne vil "g�re det rigtigt", s� t�nkte jeg, at det
ville v�re nyttigt at have E_STRICT sl�et til (under udvikling,
forst�s).

S� mine sp�rgsm�l:
1 . Hvorfor er det kun variable, der m� "pass by reference"?
(alts� hvad er den dybere mening?)

2. Har I andre E_STRICT sl�et til?
Hvorfor/hvorfor ikke?

Hvis der er andre form�l end bare at klave flere variable, vil jeg
s�dan set gerne g�re som STRICT anbefaler.
Men det kr�ver en forklaring ;-)

Mvh. J�rn

--
J�rn Andersen
http://socialister.dk
http://marxisme.dk

scootergrisen

unread,
Jan 15, 2013, 10:22:44 AM1/15/13
to
> 1 . Hvorfor er det kun variable, der m� "pass by reference"?
> (alts� hvad er den dybere mening?)

Fra PHP manualen :
"The array. This array is passed by reference because it is modified by
the function. This means you must pass it a real variable and not a
function returning an array because only actual variables may be passed
by reference."

> 2. Har I andre E_STRICT sl�et til?
> Hvorfor/hvorfor ikke?

Ja jeg vil gerne se alle slags beskeder.
Fordi s� l�rer jeg mest og kan rette det og have den bedste kode.

J�rn Andersen

unread,
Jan 15, 2013, 11:07:16 AM1/15/13
to
On Tue, 15 Jan 2013 16:22:44 +0100, scootergrisen <NEJ...@TILSPAM.DK>
wrote:

>> 1 . Hvorfor er det kun variable, der m� "pass by reference"?
>> (alts� hvad er den dybere mening?)
>
>Fra PHP manualen :
>"The array. This array is passed by reference because it is modified by
>the function. This means you must pass it a real variable and not a
>function returning an array because only actual variables may be passed
>by reference."

Jeg tror det begynder (langsomt) at d�mre. Jeg m� vist hellere (ved
lejlighed) f� l�st op p� "by reference" og "by value" ...

>> 2. Har I andre E_STRICT sl�et til?
>> Hvorfor/hvorfor ikke?
>
>Ja jeg vil gerne se alle slags beskeder.
>Fordi s� l�rer jeg mest og kan rette det og have den bedste kode.

OK - ogs� min tanke.

Birger Sørensen

unread,
Jan 15, 2013, 11:58:24 AM1/15/13
to
Jᅵrn Andersen frembragte:
> On Tue, 15 Jan 2013 16:22:44 +0100, scootergrisen <NEJ...@TILSPAM.DK>
> wrote:
>
>>> 1 . Hvorfor er det kun variable, der mᅵ "pass by reference"?
>>> (altsᅵ hvad er den dybere mening?)
>>
>> Fra PHP manualen :
>> "The array. This array is passed by reference because it is modified by
>> the function. This means you must pass it a real variable and not a
>> function returning an array because only actual variables may be passed
>> by reference."
>
> Jeg tror det begynder (langsomt) at dᅵmre. Jeg mᅵ vist hellere (ved
> lejlighed) fᅵ lᅵst op pᅵ "by reference" og "by value" ...
>
>>> 2. Har I andre E_STRICT slᅵet til?
>>> Hvorfor/hvorfor ikke?
>>
>> Ja jeg vil gerne se alle slags beskeder.
>> Fordi sᅵ lᅵrer jeg mest og kan rette det og have den bedste kode.
>
> OK - ogsᅵ min tanke.
>
>
> Mvh. Jᅵrn

Nᅵr man "pass by value" oprettes en midlertidig variabel, som
indeholder vᅵrdien. Nᅵr man "pass by reference", anvendes samme
variabel der angives i parametren.

Eks:

$a = 7;
DoThis($a);
DoThis($a+2)
echo $a;

function DoThis($b) {
$b++;
echo $b;
}

inde i funktionen har $b samme vᅵrdi som $a, og funktionen skriver 8,
dernᅵst 10 - efter kaldet udskrives $a - altsᅵ 7
Man kan gᅵre pᅵ denne mᅵde, fordi parametren overfᅵrer vᅵrdien ("pass
by value" - $a+2 udregnes og gemmes i variablen $b internt i
funktionen).

ᅵndrer man funktionen, sᅵ den defineres til at tage parametren som
reference
function DoThis(&$b) {...}
er $b inde i funktionen den samme variabel som $a udenfor - det er
referancen til $a der overfᅵres.

Eksemplet vil (med den redefinerede funktion) fᅵrst skrive 8.
Dernᅵst vil det give en fejl, fordi $a+2 ikke har en referance (det er
ikke en variabel).
Hvis scriptet fortsatte, ville det dernᅵst udskrive 8 - fordi
funktionen har ᅵndret $b, som er samme variabel som $a, og $a har
derfor nu vᅵrdien 8.

Hᅵber det spreder lidt lys... :-Z

Pass by reference har to anvendelser.
Den ene er for at spare hukommelse - store arrays der overfᅵres som
vᅵrdi (pass by value), vil skulle duplikeres, hvorfor man kan "spare"
hukommelse ved at overfᅵre dem som reference (er ogsᅵ hurtigere,
svjv.).
Den anden er, hvis man har brug for en funktion, der returnerer mede
end een vᅵrdi.

$a = 10;
$b = 0;
$c = 0;
$d = MultiFunc($a, $b, $c);
echo $a."\n".$b."\n".$c."\n".$d;

function MultiFunc($a, &$e, &$f) {
$e = $a*5;
$f = $a*20;
return $a*$a;
}

Dette vil udskrive
10
50
200
100

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
Utils http://sdccms.dk/ordbog/ http://sdccms.dk/mailfriend/
http://bredelund.dk CMS som det var meningen et sᅵdant skulle vᅵre


J�rn Andersen

unread,
Jan 15, 2013, 2:49:36 PM1/15/13
to
On Tue, 15 Jan 2013 17:58:24 +0100, Birger S�rensen
<s...@bbsorensen.com> wrote:

>H�ber det spreder lidt lys... :-Z

Tusind tak for en god og forst�elig forklaring!

Jeg tror, jeg havde forst�et noget af det helt grundl�ggende i
forvejen. Men derfra og til at forst� konsekvenserne af det er der
stadig lidt vej ...

Jeg vil pr�ve at holde lidt mere �je med de sm� "&"-tegn p� php.net:
mixed end ( array &$array )
http://dk1.php.net/manual/en/function.end.php

Som jeg forst�r det, s� betyder det, at man ofte godt kan skrive:
$nyVar = func1(func2(func3($var)));

- og at det ofte ogs� vil virke - men at det er forkert kode-stil, og
at man skal lade v�re, hvis funktionerne "pass'er by reference".

Er det nogenlunde den praktiske konklusion p� begynder-niveau?

Birger Sørensen

unread,
Jan 15, 2013, 3:52:51 PM1/15/13
to
Jᅵrn Andersen formulerede Tuesday:
> On Tue, 15 Jan 2013 17:58:24 +0100, Birger Sᅵrensen
> <s...@bbsorensen.com> wrote:
>
>> Hᅵber det spreder lidt lys... :-Z
>
> Tusind tak for en god og forstᅵelig forklaring!
>
> Jeg tror, jeg havde forstᅵet noget af det helt grundlᅵggende i
> forvejen. Men derfra og til at forstᅵ konsekvenserne af det er der
> stadig lidt vej ...
>
> Jeg vil prᅵve at holde lidt mere ᅵje med de smᅵ "&"-tegn pᅵ php.net:
> mixed end ( array &$array )
> http://dk1.php.net/manual/en/function.end.php
>
> Som jeg forstᅵr det, sᅵ betyder det, at man ofte godt kan skrive:
> $nyVar = func1(func2(func3($var)));
>
> - og at det ofte ogsᅵ vil virke - men at det er forkert kode-stil, og
> at man skal lade vᅵre, hvis funktionerne "pass'er by reference".
>
> Er det nogenlunde den praktiske konklusion pᅵ begynder-niveau?
>
>
> Mvh. Jᅵrn

$text = str_replace("\n", '<br>', str_replace( "\r", '', str_replace(
"\r\n", "\n", $text)));
Den slags er fuldt lovligt og ofte brugt.
Mener heller ikke det er forkert kodestil.
Men det kan ikke bruges, hvis en af funktionerne tager reference til en
variabel som parameter. Sᅵ fᅵr du din fejl.

Martin Larsen

unread,
Jan 16, 2013, 3:41:33 AM1/16/13
to
Birger Sᅵrensen wrote:

> $text = str_replace("\n", '<br>', str_replace( "\r", '', str_replace(
> "\r\n", "\n", $text)));

Nu ved jeg godt det bare er et eksempel, men det kan ogsᅵ skrives mere
consist:


$text = str_replace(array("\r\n","\n","\r"), array('<br>','<br>',''),
$text)));

str_replace() kan tage arrays som parametre og udskifter hvert element i
det fᅵrste med det tilsvarende i det andet.

J�rn Andersen

unread,
Jan 16, 2013, 3:47:03 AM1/16/13
to
On Wed, 16 Jan 2013 09:41:33 +0100, Martin Larsen
<martin+spam...@bigfoot.com> wrote:

>Birger S�rensen wrote:
>
>> $text = str_replace("\n", '<br>', str_replace( "\r", '', str_replace(
>> "\r\n", "\n", $text)));
>
>Nu ved jeg godt det bare er et eksempel, men det kan ogs� skrives mere
>consist:
>
>
>$text = str_replace(array("\r\n","\n","\r"), array('<br>','<br>',''),
>$text)));
>
>str_replace() kan tage arrays som parametre og udskifter hvert element i
>det f�rste med det tilsvarende i det andet.

Og for nu *fuldst�ndig* at misbruge et glimrende eksempel, s� har jeg
aldrig forst�et, hvorfor der ikke skal linjeskift efter <br> n�r PHP
skal generere html ;-)

Resultatet b�r (i n�sten alle tilf�lde) v�re: <br>\n

Birger Sørensen

unread,
Jan 16, 2013, 6:37:50 AM1/16/13
to
Den 16-01-2013, skrev Jᅵrn Andersen:
> On Wed, 16 Jan 2013 09:41:33 +0100, Martin Larsen
> <martin+spam...@bigfoot.com> wrote:
>
>> Birger Sᅵrensen wrote:
>>
>>> $text = str_replace("\n", '<br>', str_replace( "\r", '', str_replace(
>>> "\r\n", "\n", $text)));
>>
>> Nu ved jeg godt det bare er et eksempel, men det kan ogsᅵ skrives mere
>> consist:
>>
>>
>> $text = str_replace(array("\r\n","\n","\r"), array('<br>','<br>',''),
>> $text)));
>>
>> str_replace() kan tage arrays som parametre og udskifter hvert element i
>> det fᅵrste med det tilsvarende i det andet.
>
> Og for nu *fuldstᅵndig* at misbruge et glimrende eksempel, sᅵ har jeg
> aldrig forstᅵet, hvorfor der ikke skal linjeskift efter <br> nᅵr PHP
> skal generere html ;-)
>
> Resultatet bᅵr (i nᅵsten alle tilfᅵlde) vᅵre: <br>\n
>
> Mvh. Jᅵrn

Nu var det jo bare et eksempel... :/
Men jeg er enig. Der bᅵr faktisk ogsᅵ vᅵre noget tabulering, sᅵ man fᅵr
rigtig indrykning i HTML'en - ellers kan den vᅵre ret svᅵr at lᅵse.
Der er nogen der mener, at bare PHP'en er lᅵselig, er det godt nok. De
glemmer at fejlfinding og vedligeholdelse starter i HTML'en...

Bertel Lund Hansen

unread,
Jan 16, 2013, 9:56:02 AM1/16/13
to
J�rn Andersen skrev:

> Jeg vil pr�ve at holde lidt mere �je med de sm� "&"-tegn p� php.net:
> mixed end ( array &$array )
> http://dk1.php.net/manual/en/function.end.php

Det kan godt virke forvirrende at bruge referencer (&). F�lgende
to eksempler virker ens:

function twice (&$var) {
return 2*$var;
}
twice($value);

function twice ($var) {
return 2*$var;
}
$value=twice($value);

Den sidste er m�ske mere selvdokumenterende.

> Som jeg forst�r det, s� betyder det, at man ofte godt kan skrive:
> $nyVar = func1(func2(func3($var)));

> - og at det ofte ogs� vil virke - men at det er forkert kode-stil, og
> at man skal lade v�re, hvis funktionerne "pass'er by reference".

Hvis det er korrekt, logisk og ikke giver for kompakt (ul�selig)
kode, s� er der ikke noget i vejen for at pakke funktioner ind i
hinanden.

> Er det nogenlunde den praktiske konklusion p� begynder-niveau?

Men som begynder kan man nok nemmest overskue �t funktionskald ad
gangen. Generelt pakker jeg selv sj�ldent funktioner sammen, men
det forekommer.

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

Jonathan Stein

unread,
Jan 18, 2013, 6:51:08 AM1/18/13
to
Den 16-01-2013 15:56, Bertel Lund Hansen skrev:

> Det kan godt virke forvirrende at bruge referencer (&). Følgende
> to eksempler virker ens:
>
> function twice (&$var) {
> return 2*$var;
> }
> twice($value);
>
> function twice ($var) {
> return 2*$var;
> }
> $value=twice($value);

De to funktioner fungerer helt ens, fordi der ikke bliver skrevet til
$var. Derfor bliver $value aldrig sat i det første eksempel.

I første eksempel tror jeg du mente:
function twice (&$var) {
$var = 2*$var;
}
- så ville eksemplerne give samme resultat.

M.v.h.

Jonathan

Bertel Lund Hansen

unread,
Jan 18, 2013, 7:25:49 AM1/18/13
to
Jonathan Stein skrev:

> I første eksempel tror jeg du mente:
> function twice (&$var) {
> $var = 2*$var;
> }
> - så ville eksemplerne give samme resultat.

Du har ret.
0 new messages