/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
(OOP)newbie problemer med objekt-reference~
Fra : Peter Lind


Dato : 08-05-04 19:37

Hejsa der

Jeg har programmeret PHP på hustler-niveau i noget tid, men er nu ved at
'oversætte' et større CMS fra JSP til PHP.
Og jeg har dælme svært ved at fatte det hersens med objekter, variabler og
referencer.
Det jeg prøver at lave er et træ der består af nogle TreeNode objekter jeg
selv har designet.
Hver TreeNode kender til parent, firstChild, prevSibling og nextSibling, det
meste virker, men af en eller anden mærkelig grund bliver prevSibling ikke
husket - her er noget af koden:

dette er placeret i treenode.inc
--------------------------------
class TreeNode {
var $name;
var $parent;
var $nextSibling;
var $prevSibling;
var $firstChild;

var $object;

function &getParent()
{
return $parent;
}

function setParent($parent)
{
$this->parent = &$parent;
}

function &getNextSibling()
{
return $this->nextSibling;
}

function &getPrevSibling()
{
return $this->prevSibling;
}

function setPrevSibling($prevSibling)
{
$this->prevSibling = & $prevSibling;
}

function setNextSibling($nextSibling)
{
$this->nextSibling = & $nextSibling;
}

function getFirstChild()
{
return $this->firstChild;
}

function addChild( $treeNode )
{
global $lastChild;

$treeNode->setParent( &$this );

// find last child
if( $this->firstChild != null )
{
$lastChild = &$this->firstChild;

while( $lastChild->getNextSibling() != null )
{
$lastChild = &$lastChild->getNextSibling();
}

$lastChild->setNextSibling( $treeNode );

$treeNode->setPrevSibling( $lastChild );
$treeNode->setNextSibling( null );
}

if( $this->firstChild == null )
{
$this->firstChild = $treeNode;
}
}
-------------------
dette kode er i en php-side der includer treenode.inc

while ($db_menuitem = mysql_fetch_array ($result) )
{
$menuitem = new MenuItem( $db_menuitem );

if( $menuitem->id > $maxindex )
$maxindex = $menuitem->id;

$node = new TreeNode;
$node->setObject( $menuitem );

// placer noden i træet
if( $menuitem->parent == 0 )
{
$root->addChild( & $node );
}
}

hvis jeg udskriver objekterne med noget debug-kode jeg ikke har inkluderet
her i mailen, så er prevSibling der i addChild() funktionen, hvor jeg
udskriver $treeNode, men hvis jeg udkriver $node fra den funktion hvor jeg
kalder addChild() (lige efter), så står der NULL i prevSibling...

Nogle forslag til hvad jeg gør forkert? Det er sikkert noget med & og
global, men jeg er lidt konfus.

PS: Findes der en måde hvorpå man kan få at vide hvilket objekt en variabel
refererer til? Jeg var ret begejstret for toString() i Java, der ofte
udskrev en adresse - er der noget lignende i PHP?

Mvh
Peter Lind



 
 
Michael Rasmussen (08-05-2004)
Kommentar
Fra : Michael Rasmussen


Dato : 08-05-04 21:47

On Sat, 08 May 2004 20:37:12 +0200, Peter Lind wrote:

>
> $node = new TreeNode;
Prøv dette i stedet for: $node =& new TreeNode;

Forklaring:
Hvis du undlader &, får du en ny instans af TreeNode, hver gang du
refererer til den. Med & sikrer du dig, at du får en reference.

Uden &: Pass by value.
Med $: Pass by reference.

--
Hilsen/Regards
Michael Rasmussen
--------------------------------------------------------------
Make input easy to proofread.
- The Elements of Programming Style (Kernighan & Plaugher)



Per Thomsen (09-05-2004)
Kommentar
Fra : Per Thomsen


Dato : 09-05-04 00:21

Peter Lind wrote:
> Hejsa der
>
[klip]
> Og jeg har dælme svært ved at fatte det hersens med objekter, variabler og
> referencer.

Jeg går ud fra at du har været en tur forbi:
   http://dk2.php.net/references

[klip]
> function setParent($parent)

Du skal i funktionsheaderen angive at din parameter skal være
pass-by-reference, ved at skrive & foran variabelnavnet:
   function setParent( &$parent )

Hvis du ikke gør det, tager PHP en kopi af den paremeter, du angiver,
når du kalder funktionen.


> {
> $this->parent = &$parent;
> }
Her får du blot $this->parent til at pege på funktionen's lokale kopi af
$parent. Jeg gætter på at det ikke var meningen. Du undgår det ved at
skrive funktionsheaderen, som beskrevet ovenfor.

Og der er vist en del steder i din klasse, du skal have rettet det ;).

[klip]

>
> PS: Findes der en måde hvorpå man kan få at vide hvilket objekt en variabel
> refererer til? Jeg var ret begejstret for toString() i Java, der ofte
> udskrev en adresse - er der noget lignende i PHP?

Ikke svjv, men funktionen var_dump, kan nogle gange være rar at anvende.
   http://dk2.php.net/var_dump


MVH Per Thomsen,
http://www.pert.dk/

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste