Avatar billede webcreator Nybegynder
07. april 2006 - 12:29 Der er 15 kommentarer og
1 løsning

Referencer i PHP

Hej Eksperter.

Jeg arbejder i øjeblikket på et framework i PHP. I den forbindelse stødte jeg på nedenstående tekst på Zend.com :

"In PHP 5, the infrastructure of the object model was rewritten to work with object handles. Unless you explicitly clone an object by using the clone  keyword you will never create behind the scene duplicates of your objects. In PHP 5, there is neither a need to pass objects by reference nor assigning them by reference."
http://www.zend.com/php5/andi-book-excerpt.php

Fra ovenstående forstår jeg, at det ikke længere er nødvendigt at sende objekter som referencer vha. &-tegnet - dette sker nu automatisk, hvorimod man tidligere fik en kopi hvis ikke man brugte &-tegnet.

En hurtig test viste dog, at det stadig er en kopi man arbejder på, hvis ikke man bruger &-tegnet. Så hvad er korrekt? Er det noget vrøvl de har skrevet på Zend's side, eller gør jeg noget forkert?

Et hurtigt eksempel :

<?php

class Test
{
    public function increment($var)
    {
        $var++;
    }
}

$num = 5;
echo "Værdi før increment: $num<br>"; // Udskriver 5
$t = new Test();
$t->increment($num);
echo "Værdi efter increment: $num"; // Udskriver 5

?>
Avatar billede webcreator Nybegynder
07. april 2006 - 12:30 #1
For en god ordens skyld skal jeg lige gøre opmærksom på, at jeg naturligvis bruger PHP5
Avatar billede ttopholm Nybegynder
07. april 2006 - 12:36 #2
Hvor læser du det henne, med at du ikke skal sende & med...
Avatar billede ttopholm Nybegynder
07. april 2006 - 12:39 #3
ahh.. der... melder pas..
Avatar billede ttopholm Nybegynder
07. april 2006 - 12:40 #4
Men den test du viser der kloner jo heller ikke et andet object, men opretter kun et object og kalder en funktion i den, og der skal du bruge & hvis $num skal reference overføres.
Avatar billede morhan Novice
07. april 2006 - 12:43 #5
$num er heller ikke et objekt

i php4:

class Test
{
    var $var;

    function increment()
    {
        $this->var++;
    }
}

$a = new Test();
$a->var = 5;

$b = $a; // vil b pege på a, eller er det et nyt selvstændigt objekt?
$b->increment();

echo $a->var;
Avatar billede coderdk Praktikant
07. april 2006 - 12:53 #6
Jeg tror kun dette gælder for objekter:

<?php

class num
{
    private $num = 0;
    public function get()
    {
        return $this->num;
    }
    public function inc()
    {
        $this->num++;
    }
}

class Test
{
    public function increment($var)
    {
        $var->inc();
    }
}

$num = new num();
$num->inc();
$num->inc();
$num->inc(); // Nu 3
echo "Værdi før increment: " . $num->get() ."<br>"; // Udskriver 3
$t = new Test();
$t->increment($num);
echo "Værdi efter increment: " . $num->get(); // Udskriver 4

?>
Avatar billede webcreator Nybegynder
07. april 2006 - 12:54 #7
Jeg ved ikke lige helt hvad jeg skal bruge dit indlæg til, Morphan. Jeg arbejder med PHP5. Men så vidt jeg har forstået, så burde $b være en kopi. Du kan dog have fat i noget når du siger, at $var i mit eksempel ikke er et objekt - men så skal det være fordi PHPs egne typer ikke er objekter.
Avatar billede morhan Novice
07. april 2006 - 12:59 #8
i php4 indeholder b et nyt objekt, dvs $a->var er stadig 5
i php5 er $a->var 6
Avatar billede webcreator Nybegynder
07. april 2006 - 13:00 #9
Yep, du har ret Coder. En hurtig test jeg selv lige lavede viste også, at det virker med mine egne objekter. Beklager at jeg ikke tjekkede det før - jeg var bare så sikker på at PHPs typer fungerede som objekter.

gider du smide et svar, Coder?
Avatar billede coderdk Praktikant
07. april 2006 - 13:05 #10
:)
Avatar billede webcreator Nybegynder
07. april 2006 - 13:11 #11
morphan > Som vi lige har konkluderet, så er PHPs egne primitive typer ikke objekter - så det er ikke tilfældet, nej.

Jeg har også registreret at både 'function test(&$var)' og 'test(&$var)' fungerer. Dvs. man kan selv bestemme hvor man vil angive at det er en reference man overfører. Ifl. Zend skulle man få en E_STRICT warning om at den ene fremgangsmåde er 'deprecated' - men jeg kan ikke finde den side jeg har læst det på. Ved I hvilken af metoderne man skal bruge? Så vidt jeg husker, så bør det angives i definitionen af funktionen. Men det irriterer mig at jeg ikke får den fejl-meddelelse. Jeg har fuld error_reporting slået til.
Avatar billede morhan Novice
07. april 2006 - 13:13 #12
hvad siger du nej til?
Avatar billede morhan Novice
07. april 2006 - 13:14 #13
hvis du lægger mærke til det, så har jeg modificeret til klasse, så $var et en variabel i klassen
Avatar billede webcreator Nybegynder
07. april 2006 - 13:52 #14
Yep. Men det skulle ikke ændre noget. Når du smider et tal i variablen, så ændrer PHP det til en integer
Avatar billede morhan Novice
07. april 2006 - 13:58 #15
Jeg ved ikke helt, om vi snakker om det samme

$a = new Test();
$a->var = 5;

$b = $a; // vil b pege på a, eller er det et nyt selvstændigt objekt?
$b->increment();

echo $a->var;

er det dette du ikke er enig med mig i, når jeg siger at $b = $a gør noget forskelligt om du kører php4 eller php5?

og at $a->var ikke ændrer sig i ovenstående, når du kører php4?
Avatar billede webcreator Nybegynder
07. april 2006 - 17:54 #16
Jeg tror også vi snakker lidt ved siden af hinanden. I PHP4 vil $a og $b ikke have samme værdi (der bliver lavet en kopi af objektet), i PHP5 er værdierne ens (der arbejdes på referencer).

Morphan > Du må i øvrigt også gerne lige smide et svar som tak for input.
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