[PHP] Wanneer een & gebruiken ???

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • sjon.
  • Registratie: November 2002
  • Laatst online: 14-01-2024
ik word helemaal gek.

Ik ben bezig met wat classes in php, en wil bij bepaalde functies een reference teruggeven, danwel ontvangen... en dus zit ik al een uurtje of wat met die & te klote. En ik snap nou dus nog steeds niet wanneer ik em hoe en waar moet neerzetten...

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php

    // waar neerzetten bij 't maken ???
    // bedoeling is dat ik dus een ref naar dat nieuwe object krijg.
    // die new geeft al een copy van me class, en da's de bedoeling (soms)
    // en op die copy wil ik dus me stuff uitvoeren, maar wanneer doe ik dat
    // dan op die originele copy, en wanneer op een copy van een copy ???
    // dus: welke testX is de goeie ?
    // en wat moet het zijn als ik een ref naar me nieuwe object wil teruggeven,
    // zonder dat 't een copy van een ref word, dus een ref van een ref ???
    // of wil ik nu iets wat niet kan c.q. ben ik gewoon stompzinnig bezig.

    class test {

        function test1 () {
            $this->bla = new Object();
            return $this->bla;
        }

        function &test2 () {
            $this->bla = new Object();
            return $this->bla;  
        }

        function test3 () {
            &$this->bla = new Object();
            return $this->bla;
        }

        function test4 () {
            $this->bla = new Object();
            return &$this->bla;
        }

        function test5 () {
            $this->bla = new Object();
            &return $this->bla;
        }

    }

    // en waar neerzetten bij 't opvragen ???
    // ervanuitgaande dat testX 1 van de bovenstaande functies is,
    // welke 'opvraagmethode' is de goeie?

    $q = new test;
    $r = $q->testX();
    $s =& $q->testX();
    $t = &$q->testX();

?>



ik bedoel, ik snap dit wel:

PHP:
1
2
3
4
5
6
7
8
9
10
11
<?php

    function test (&$op) {
        $op++;
    }

    $bla = 3;
    test($bla);
    echo $bla; // dit moet dus 4 printe...

?>


maar dan houd 't geloof ik op :( :( :( :(


alvast vriendelijk bedankt :*)

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
function test (&$op) { 
        $op++; 
    } 

    $bla = 3; 
    test($bla); 
    echo $bla; // dit moet dus 4 printe... 

kijk, deze functie heeft geen return, en ook geen $var=function()
en om data binnen een class te houden moet je volgens mijn er "var bla" na de class test neerzetten

function test3 (&$var) {
$this->bla = new Object();
$var=&$this->bla;
}
aanroepen met
$q->test3($t);

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
check dit:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?php 
 
    class test2
    {
        var $name;
        var $x;
        
        function test2($name)
        {
            $this->name = $name;
            $this->x = 0;
        }
        
        function inc()
        {
            $this->x++;
        }
    }
    

    class test { 

        var $bla;
        
        function withoutref($name) { 
            $this->bla = new test2($name); 
            return $this->bla; 
        } 
        
        
        function &withref($name) { 
            $this->bla = new test2($name); 
            return $this->bla;     
        } 
        
    } 
    
    $t = new test; 
    $t2 = &$t->withoutref("call_with_and_mehtod_without"); 
    $t2->inc();  
    
    
    echo "<PRE>";      
    print_r($t2);
    print_r($t->bla);
    echo "</PRE>";

    echo "<HR>";
    
    $t = new test; 
    $t2 = $t->withoutref("call_without_and_mehtod_without"); 
    $t2->inc();  
        
    echo "<PRE>";      
    print_r($t2);
    print_r($t->bla);
    echo "</PRE>";
    
    echo "<HR>";
    
    $t = new test; 
    $t2 = &$t->withref("call_with_and_mehtod_with"); 
    $t2->inc();  
   
    echo "<PRE>";      
    print_r($t2);
    print_r($t->bla);
    echo "</PRE>";

    echo "<HR>";
    
    $t = new test; 
    $t2 = $t->withref("call_without_and_mehtod_with"); 
    $t2->inc();  
    
    echo "<PRE>";      
    print_r($t2);
    print_r($t->bla);
    echo "</PRE>";   
?>


Zoals je ziet gaat het er om dat je in je call (aanroep) een & plaatst, want in de andere gevallen blijft de $x van de aan $t1 hangende $t2 ($bla) achter na een increment. in de PHP manual staat dat je bij "return by reference" ook een & voor de method naam moet plaatsen, maar het is mij (nog) niet duidelijk waarom precies.

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
oja en als dus een ref naar een ref wilt, moet je nog weer iest anders doen. Plaats deze class en code eens bij wat er al stond:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class test3 
    {
        var $bla;
        
        function test3($bla)
        {
            $this->bla = &$bla;
        }
        
    }
     
    $t = new test;  
    $t2 = &$t->withoutref("call_with_and_mehtod_without");  
    $t3 = new test3(&$t2);
    $t2->inc();   

    echo "<PRE>";       
    print_r($t2); 
    print_r($t->bla);
    print_r($t3->bla); 
    echo "</PRE>";


of

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class test3 
    {
        var $bla;
        
        function test3(&$bla)
        {
            $this->bla = &$bla;
        }
        
    }
     
    $t = new test;  
    $t2 = &$t->withoutref("call_with_and_mehtod_without");  
    $t3 = new test3($t2);
    $t2->inc(); 

    echo "<PRE>";       
    print_r($t2); 
    print_r($t->bla);
    print_r($t3->bla); 
    echo "</PRE>";



ALLEEN als in de constructor van test3 een & voor de $this->bla = &$bla staat, zal $t3->bla->x mee veranderen. Dan is het dus een ref van een ref. Wanneer je dat niet doet maakt ie als nog een kopie...

nog ff bikkelen...in PHP5 wordt dit allemaal een stuk begrijpelijker :)

Acties:
  • 0 Henk 'm!

  • sjon.
  • Registratie: November 2002
  • Laatst online: 14-01-2024
meh, begin 't geloof ik te snappen... :) thnx guys... _/-\o_
zal de doc's er nog maar eens 10 keer op naslaan...
ben er alleen nog niet uit of het nu $var =& foo(); of $var = &foo() moet zijn.
de docs zijn daar ook niet echt duidelijk over... majah, eerst maar eens wat meer teste...

Acties:
  • 0 Henk 'm!

  • ^Mo^
  • Registratie: Januari 2001
  • Laatst online: 26-07 22:25
sjon. schreef op 15 November 2002 @ 17:16:
meh, begin 't geloof ik te snappen... :) thnx guys... _/-\o_
zal de doc's er nog maar eens 10 keer op naslaan...
ben er alleen nog niet uit of het nu $var =& foo(); of $var = &foo() moet zijn.
de docs zijn daar ook niet echt duidelijk over... majah, eerst maar eens wat meer teste...
Dat maakt geen moer uit...
$var =& foo(); is precies hetzelfde als $var = &foo(); het is gewoon een stijlkwestie dan (wat vind je duidelijker/mooier).

"There are 10 kinds of people in the world, those who understand binary and those who don't" | Werkbak specs


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
in de PHP manual staat dat je bij "return by reference" ook een & voor de method naam moet plaatsen, maar het is mij (nog) niet duidelijk waarom precies.
ik heb al een vermoeden waarom het niet uitmaakt of je al dan niet voor de method-declaratie (dus function &foo(){} of function foo()){} een & plaatst, wanneer je function een class-method is. Dit is (vermoed ik dus) omdat een php object-variabele altijd standaard een referentie naar een object is (let wel, dit zegt in feite niks over naar welk object, kopie of niet). Dit is analoog met het aanroepen van een method op een pointer naar een object in C++. Daarom ook geen $object.method() maar $object->method()
Pagina: 1