๐Ÿš€ go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
9 messages
9 total messages Started by Ward Poelmans Sun, 11 May 2003 14:54
PHP probleempje
#5306
Author: Ward Poelmans
Date: Sun, 11 May 2003 14:54
36 lines
1571 bytes
Kan iemand mij zeggen waarom het volgende stukje php 
code niet werkt?
Als je het uitvoert staat er gewoon:
Naam:
Terwijl er:
Naam: Hello
zou moeten staan.

Ward.

<?php 

class test {
	var $naam;
	function setnaam($naam) {
		$this->naam = $naam;
	}
	
	function getnaam() {
		return $this->naam;
	}
}

function haaldata($data) {
	$data->setnaam("hello");
}

function toondata($data) {
	echo "Naam: " . $data->getnaam() . "<br>";
}

$gegevens = new test;
haaldata($gegevens);
toondata($gegevens);

?>
Re: PHP probleempje
#5307
Author: Roel Schroeven
Date: Sun, 11 May 2003 15:44
66 lines
2715 bytes
Ward Poelmans wrote:
> Kan iemand mij zeggen waarom het volgende stukje php 
> code niet werkt?
> Als je het uitvoert staat er gewoon:
> Naam:
> Terwijl er:
> Naam: Hello
> zou moeten staan.
> 
> Ward.
> 
> <?php 
> 
> class test {
> 	var $naam;
> 	function setnaam($naam) {
> 		$this->naam = $naam;
> 	}
> 	
> 	function getnaam() {
> 		return $this->naam;
> 	}
> }
> 
> function haaldata($data) {
> 	$data->setnaam("hello");
> }
> 
> function toondata($data) {
> 	echo "Naam: " . $data->getnaam() . "<br>";
> }
> 
> $gegevens = new test;
> haaldata($gegevens);
> toondata($gegevens);
> 
> ?>

Je moet in haaldata en toondata het argument $data meegeven als call by 
reference in plaats van call by value. Anders wordt het object in zijn 
geheel gekopieerd, en werken de instructies binnen de functies op die 
kopie in plaats van op het origineel.

In php doe je dat door er '&' voor te zetten in de functiedefinitie:

function haaldata(&$data) ...
en
function toondata(&$data) ...

Eigenlijk begrijp ik wel niet goed waarom je daar ook geen member 
functies van maakt. In plaats van

haaldata($gegevens);
toondata($gegevens);

kan je het dan zo doen:

$gegevens->haaldata();
$gegevens->toondata();

Mij lijkt dat alleszins logischer.

-- 
"Codito ergo sum"
Roel Schroeven
http://roelschroeven.net
Re: PHP probleempje
#5308
Author: JeroenV
Date: Sun, 11 May 2003 15:47
32 lines
2014 bytes
Ward Poelmans wrote:

> Kan iemand mij zeggen waarom het volgende stukje php
> code niet werkt?
> Als je het uitvoert staat er gewoon:
> Naam:
> Terwijl er:
> Naam: Hello
> zou moeten staan.

PHP geeft standaard de waarde van een functieparameter door "by value".
M.a.w., $gegevens en $data zijn 2 verschillende variabelen. $gegevens
blijft ongewijzigd, terwijl $data wel degelijk gewijzigd wordt.

Je kan variabelen "by reference" doorgeven, waarmee het dus wel zou lukken.
Het enige wat je hiervoor moet doen is een ampersand (&) voor de
functieparameter zetten:

> function haaldata(&$data) {
> $data->setnaam("hello");
> }
> 
> function toondata(&$data) {
> echo "Naam: " . $data->getnaam() . "<br>";
> }

Meer info op
<URL:http://www.php.net/manual/en/functions.arguments.php#functions.arguments.by-reference>

-- 
Mvg, JeroenV
Nederlandstalig Usenetportaal: <URL:http://www.briachons.org/>
Re: PHP probleempje
#5309
Author: JeroenV
Date: Sun, 11 May 2003 15:49
22 lines
1580 bytes
Roel Schroeven wrote:

<knip>
> Eigenlijk begrijp ik wel niet goed waarom je daar ook geen member
> functies van maakt. In plaats van
> 
> haaldata($gegevens);
> toondata($gegevens);
> 
> kan je het dan zo doen:
> 
> $gegevens->haaldata();
> $gegevens->toondata();
> 
> Mij lijkt dat alleszins logischer.

Voor toondata() mss wel, maar waarom met haaldata()? Dan is het abstracte
van je klasse weg...

-- 
Mvg, JeroenV
Nederlandstalig Usenetportaal: <URL:http://www.briachons.org/>
Re: PHP probleempje
#5310
Author: Roel Schroeven
Date: Sun, 11 May 2003 16:04
29 lines
2024 bytes
JeroenV wrote:
> Roel Schroeven wrote:
> 
> <knip>
> 
>>Eigenlijk begrijp ik wel niet goed waarom je daar ook geen member
>>functies van maakt. In plaats van
>>
>>haaldata($gegevens);
>>toondata($gegevens);
>>
>>kan je het dan zo doen:
>>
>>$gegevens->haaldata();
>>$gegevens->toondata();
>>
>>Mij lijkt dat alleszins logischer.
> 
> 
> Voor toondata() mss wel, maar waarom met haaldata()? Dan is het abstracte
> van je klasse weg...

Hm, ja, misschien wel. Hangt af van de context. In het gegeven voorbeeld 
zie ik niet veel verschil in abstractie tussen beide.

-- 
"Codito ergo sum"
Roel Schroeven
http://roelschroeven.net
Re: PHP probleempje
#5318
Author: Ward Poelmans
Date: Mon, 12 May 2003 15:21
9 lines
1337 bytes
"Ward Poelmans" <Ward.Poelmans@my-mail.ch.REMOVE_THIS> wrote in 
news:pan.2003.05.11.14.54.45.290882@my-mail.ch.REMOVE_THIS:

> 
> 

bedankt allemaal!!

Ward.
Re: PHP probleempje
#5317
Author: Ward Poelmans
Date: Mon, 12 May 2003 15:22
10 lines
1474 bytes
JeroenV <jeroenv@pebbels.be.remove> wrote in 
news:47848962.TS4J97216d@jvaes.cjb.net:

> Voor toondata() mss wel, maar waarom met haaldata()? Dan is het abstracte
> van je klasse weg...

Ik heb nog nooit met klassen gewerkt en dit was gewoon een testje.
Maar wat bedoel je met abstract?

Ward.
Re: PHP probleempje
#5323
Author: JeroenV
Date: Mon, 12 May 2003 16:51
22 lines
2063 bytes
Ward Poelmans wrote:

> JeroenV <jeroenv@pebbels.be.remove> wrote in
> news:47848962.TS4J97216d@jvaes.cjb.net:
> 
>> Voor toondata() mss wel, maar waarom met haaldata()? Dan is het abstracte
>> van je klasse weg...
> 
> Ik heb nog nooit met klassen gewerkt en dit was gewoon een testje.
> Maar wat bedoel je met abstract?

Een klasse is een abstractie. Vergelijk het met een cake en de bakvorm: de
vorm is de klasse, een cake is een instantie van die klasse.

Klassen moet je dus zo algemeen mogelijk houden. Als je "haaldata" in de
klasse gaat zetten is ze niet meer algemeen, aangezien je daar een vaste
waarde aan de variabele "naam" gaat geven. In die context is dat dus niet
echt goed.

-- 
Mvg, JeroenV
Nederlandstalig Usenetportaal: <URL:http://www.briachons.org/>
Re: PHP probleempje
#5324
Author: Roel Schroeven
Date: Mon, 12 May 2003 18:18
38 lines
3008 bytes
Ward Poelmans wrote:
> JeroenV <jeroenv@pebbels.be.remove> wrote in 
> news:47848962.TS4J97216d@jvaes.cjb.net:
> 
> 
>>Voor toondata() mss wel, maar waarom met haaldata()? Dan is het abstracte
>>van je klasse weg...
> 
> 
> Ik heb nog nooit met klassen gewerkt en dit was gewoon een testje.
> Maar wat bedoel je met abstract?

Een abstractie is het verstoppen van de implementatiedetails, die de 
gebruiker van de abstractie toelaten op een hoger niveau te denken en te 
werken. Een filesystem is bijvoorbeeld een abstractie, omdat het je 
toelaat te werken met files en directories in plaats van cilinders en 
sectoren. Bonus is dat je dikwijls de implementatie kan veranderen, en 
toch dezelfde interface behouden. Zo kan je probleemloos verschillende 
filesystems gebruiken (ext2, ext3, vfat, nfs, smbfs, ...) zonder al je 
programma's te moeten aanpassen.

Software is eigenlijk een stapel van de ene abstractielaag bovenop de 
andere. Een klasse is een goede methode om interface en implementatie 
gescheiden te houden, en dus om een abstractie te cre๏ฟฝren. Over het 
algemeen is het een goed idee de onderdelen van je programma zo abstract 
mogelijk te houden, maar zoals zo dikwijls kan overdaad ook schadelijk 
zijn, zoals Joel Spolsky beschrijft: 
http://www.joelonsoftware.com/articles/LeakyAbstractions.html

Jeroen bedoelt hier dat je haaldata() op een andere manier zou kunnen 
implementeren, of andere functies maken die hetzelfde doen, zonder dat 
je de klasse hoeft te veranderen.


-- 
"Codito ergo sum"
Roel Schroeven
http://roelschroeven.net
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads