OOP: Objecten en References

Door Martijn Wieringa, 19 jaar geleden, 4.565x bekeken

Deze tutorial legt uit wat references zijn, en hoe je ze binnen PHP kunt toepassen.

Gesponsorde koppelingen

Inhoudsopgave

  1. Waarom deze tutorial:
  2. Voorbereiding
  3. Wat is het nut van references
  4. (heen en weer) Kopieeren van een objecten
  5. References in het algemeen
  6. References als argument van een functie
  7. References als resultaat van een functie
  8. Samenvatting

 

Er zijn 16 reacties op 'Oop objecten en references'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Mitch X
Mitch X
19 jaar geleden
 
0 +1 -0 -1
Je hebt het zelf niet helemaal door denk ik :+
Er is namelijk een verschil tussen een referentie en een pointer, jij hebt het over de eerste.

Even een C++ voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
int i = 10; // var i om mee te werken
int *p; // pointer p
int &r = i; // reference r
p = &i;

// En wat kan nou niet met references?
p++; // wijst naar de volgende int waarde
r++; // telt 1 op bij i.


Edit:
Waar ik opeens aan denk is ook zo jammer van PHP:
je kunt geen functies voor de = zetten.
Martijn Wieringa
Martijn Wieringa
19 jaar geleden
 
0 +1 -0 -1
Je hebt helemaal gelijk.. ow wat vreselijk slecht :P.. ik zal 't gelijk aanpassen
Mitch X
Mitch X
19 jaar geleden
 
0 +1 -0 -1
Als ik mijn post zo lees, klinkt ie heel erg als "ik-weet-het-beter".
Maar dat bedoelde ik dus niet :+
Martijn Wieringa
Martijn Wieringa
19 jaar geleden
 
0 +1 -0 -1
'k schreef ut stukje niet voor mezelf, maar zodat anderen d'r wat van kunnen opsteken :P Dus elke feedback is welkom.. als ik perongeluk met verkeerde termen ga strooien is dat alleen maar verwarrend, dus beter zow (:
Legolas
Legolas
19 jaar geleden
 
0 +1 -0 -1
http://www.phphulp.nl/php/tutorials/8/342/709/, per ongeluk " en ' door elkaar ;)


19 jaar geleden
 
0 +1 -0 -1
Ik vind je tutorial eigenlijk een beetje te logisch voor tutorial.

Quote:
return "" . $this->name . " heeft een saldo van ? " . number_format($this->cash, 2) . "";
Wat hebben die lege strings aan de buitenkant voor nut?

Quote:
Kopieeren van een objecten
Nederlands...
Mathieu Kooiman
Mathieu Kooiman
19 jaar geleden
 
0 +1 -0 -1
Quote:
Merk op dat in PHP 4 er alleen references gemaakt kunnen worden naar objecten; niet naar 'normale' variabelen. Mogelijk veranderd dit in de toekomst..


.. dit is niet waar. Ook in PHP4 kun je gewoon references naar gewone variabelen hebben:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

$a
= "test";
$b =& $a;

$b = "http://www.scriptorama.nl";

echo "$a\n";

?>


wordt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
mathieu@loina:~ $ php4 -c. -v
PHP 4.4.2-1 (cli) (built: Jan 18 2006 19:59:20)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

mathieu@loina:~ $ php4 -c. test.php
http://www.scriptorama.nl


.. tevens is het jammer dat je wel enigzins aangeeft dat er verschillen zijn tussen PHP4 en PHP5, maar vervolgens beschrijf je niet dat een instantie van een object in PHP5 standaard een "reference" is.

In PHP5 is de variabele waar je instantie "in zit" niet meer dan een object handle: een verwijzing naar het daadwerkelijke object. Als je dit toewijst aan een andere variable wijst dit nog steeds naar het zelfde object. Pas wanneer je de clone() functie aanroept zal het object gekopieerd worden.
Koos-Bert
Koos-Bert
19 jaar geleden
 
0 +1 -0 -1
Ik heb nog steeds niet zo veel begrepen van objecten, wat kan een object meer dan een functie? Want hoe ik het zie is dat een object ongeveer hetzelfde is als een pagina met allemaal functies onder elkaar, maar waarschijnlijk heb ik dit verkeerd begrepen...
Cees St
Cees St
19 jaar geleden
 
0 +1 -0 -1
Koos-Bert

Heel simpel gezegd is een object meestal een class welke gecreerd is.
Deze class/object kan niet alleen functioneel zijn, maar kan daarnaast ook nog zijn eigen data (properties) en functies (methoden) hebben.
Grootste verschil met een functie is dan ook dat een functie iets uitvoert en daarna is opgeheven (tot dat je hem opnieuw oproept), terwijl een class na het NEW commando een instantie blijft zolang als het script actief is.
Daarnaast kent een class het overerven van ouders, dus je kan een class afleiden van een andere class, met alle properties en methoden van die andere class.
Op zich is een functie per definitie procedureel en class zijn object georienteerd.
De overgang van procedureel naar object georienteerd is voor ervaren programmeurs een zware klus, nieuwkomers zouden dan ook het liefst onmiddelijk beginnen om het object georienteerd programmeren eigen te maken.
Het is in de toekomst niet meer een keus, zal ik procedureel of object georienteerd werken. Procedureel werkende zullen uiteindelijk hun baan verliezen.
Een heel verhaal, ik hoop dat het toch een beetje duidelijk is.

Groet Cees
Cees St
Cees St
19 jaar geleden
 
0 +1 -0 -1
Na het doorlezen van de gehele tutorial ben ik van mening dat er niet een antwoord wordt gegeven op de vraag, waarom een references gebruiken?
De belangrijkste reden om te doen is m.i., wanneer er spraken is van omvangrijke geheugen gebieden die gebruikt worden door var's. Daarbij kan je denken aan een dataset of een tekstfile bijvoorbeeld. In bijna alle andere situaties is het af te raden omdat er veel te gemakkelijk fouten mee gemaakt worden. Ook begrijp ik niet wat er tegen een return waarde is. Daarbij vind ik het gebruik van references op de rand van procedureel en object georienteerd werken.

Verder wel een duidelijke uitleg hoe references te gebruiken.
Douwe Hoogeveen
Douwe Hoogeveen
19 jaar geleden
 
0 +1 -0 -1
Grappige tutorial, maar er zitten fouten in! Bijvoorbeeld in het volgende onderdeel:
Fatal error: Call to a member function on a non-object in /home/virtual/site17/fst/var/www/html/testoop/output3.php on line 22

Op regel 22 in het document staat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    function addTwentyEuro(&$client)
    {

        $client->setCash($client->getCash() + 20); // Dit is volgens de output een fout!!
        print($client->toString()); // Print #1
    }

?>


Kan iemand mij uitleggen wat hier dan fout gaat??
Jelmer -
Jelmer -
19 jaar geleden
 
0 +1 -0 -1
Dat kan maar 1 ding betekenen: $client bevat, of in dit geval beter, verwijst niet naar een geldig object.

Verander die 2 regels in die functie eens in var_dump($client);. Wat geeft hij dan als uitvoer?
Jurgen assaasas
Jurgen assaasas
18 jaar geleden
 
0 +1 -0 -1
Erg goede tut, ik begin het goed te begrijpen op deze manier. Ik ben er d.m.v. vallen en opstaan(bij wijze van ja:P) er een beetje uitgekomen.
Tikkes C
Tikkes C
16 jaar geleden
 
0 +1 -0 -1
Ik snap nog steeds helemaal niets van die references...ik las dit nu 3 keer en ik snap er echt niets van :s

ook OOP vind ik nog maar vaag...ik snap het principe ervan wel maar hoe het zelf in elkaar te steken, ik zou niet weten waar te beginnen.
Laat staan wat ik in de class moet zetten e.d.

Ik las laatst ook die tutorial 'OOP denken' van Jelmer, hier ben ik wel wijzer uit gekomen, nu weet ik wat een object juist inhoudt maar ik zit nog steeds vast met het zelf schrijven van classes, objects, methods,...


Grote zucht!
Jelmer -
Jelmer -
16 jaar geleden
 
0 +1 -0 -1
In PHP 5 hoef je niet met references te werken, sinds 5 worden objecten als het ware standaard "by reference" meegegeven. Dit werkt gewoon in PHP 5:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

$x
= new stdClass();
$x->y = 'Hello';

function
greet($b) {
   $b->y .= ' World';
}


greet($x);

echo $x->y // Hello World
?>


(En die tutorial was van PHPErik ;) )
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
NiVin
niVin
15 jaar geleden
 
0 +1 -0 -1
Douwe Hoogeveen benoemde de fout al in 2006; de functie getClient() 'kent' de array cli?nten niet. Om de tut correct te laten werken moet de cli?nten array of 'global' worden gemaakt in de functie getClient() :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
 
 function getClient($name)
    {

    global $clienten;

        for($i = 0; $i < sizeof($clienten); $i++)
        {

            if(strcasecmp($clienten[$i]->getName(), $name) === 0)
            {

                return $clienten[$i]; // Geeft een KOPIE!! van het object terug
            }
        }


        return null; // Gebruik bij 'geen object' liever een 'null' i.p.v. bijvoorbeeld een 'false' (of wat dan ook). Wordt in dit voorbeeld niet afgevangen.
    }

?>


?f geef de cli?nten array mee als argument aan de functie:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

$client
= getClient("PHPHulp.nl", $clienten); // Zoek de client op

    // Zoek een client op in de array $clienten op basis van de naam

    function getClient($name, $clienten)
    {


        for($i = 0; $i < sizeof($clienten); $i++)
        {

            if(strcasecmp($clienten[$i]->getName(), $name) === 0)
            {

                return $clienten[$i]; // Geeft een KOPIE!! van het object terug
            }
        }


        return null; // Gebruik bij 'geen object' liever een 'null' i.p.v. bijvoorbeeld een 'false' (of wat dan ook). Wordt in dit voorbeeld niet afgevangen.
    }

?>


Leuke tutorial verder!!

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Waarom deze tutorial:
  2. Voorbereiding
  3. Wat is het nut van references
  4. (heen en weer) Kopieeren van een objecten
  5. References in het algemeen
  6. References als argument van een functie
  7. References als resultaat van een functie
  8. Samenvatting

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.