[PHP] persistent objects

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Een tijdje geleden opende ik een topic over procedureel versus OOP proggen in PHP. Dat draaide uiteindelijk een beetje uit op de vraag of het nou wel of niet goed te doen was om een persistent object-structuur in PHP bij te houden. Nu heb ik ff tijd gehad om het te proberen, en welja, het is gelukt! Ik denk ik post het scriptje even, omdat het erg eenvoudig mis gaat :)

Doel van het probeersel was om in 1 sessievariabele een object-hierarchietje op te bouwen (eenmalig), en bij elke refresh een object dieper in de hierarchie te wijzigen.

code.class.php:
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
<?
class CNode
{
    var $m_sName;
    var $m_aChildren;
    
    function CNode($sName)
    {
        $this->m_sName       = $sName;
        $this->m_aChildren   = array();
    }
    
    function addChild(&$cNode)
    {
        $cNode->m_iNumParents++;
        $this->m_aChildren[] = &$cNode;
    }
    
    function &getChild($sName)
    {   
        for($n = 0; $n < count($this->m_aChildren) ; $n++)
        {
            if($this->m_aChildren[$n]->m_sName == $sName)
            {
                return $this->m_aChildren[$n];
            }
        }   
    }
        
    function setName($sName)
    {
        $this->m_sName = $sName;
    }
    
    function render($depth = 0)
    {
        if($depth == 0) 
        {
            echo "<pre>";
        }
        
        for($n = 0; $n < 3*$depth; $n++)
        {
            print(" ");
        }
        
        print($this->m_sName."\n");

        foreach($this->m_aChildren as $cChildNode)
        {
            if(is_object($cChildNode))
            {
                $cChildNode->render($depth+1);
            }
        }
        
        if($depth == 0) 
        {
            echo "<pre>";
        }
    }
}
?>


nodetest.php:
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
<?
    include("cnode.class.php");
    session_start();
    
    if(!isset($_SESSION['counter']))
    {
        $counter = 0;
        
        $cRoot   = new CNode("root");
        
        $cChildA = new CNode("child_a");
        $cChildB = new CNode("child_b".$counter);
        $cChildC = new CNode("child_c");
        
        $cRoot->addChild($cChildA);
        $cRoot->addChild($cChildB);
        $cRoot->addChild($cChildC);
        
        session_register('cRoot');
        session_register('counter');
    }
    else
    {
        $cChildB = & $_SESSION['cRoot']->getChild('child_b'.$_SESSION['counter']);
        if(is_object($cChildB))
        {
            $cChildB->setName("child_b".++$_SESSION['counter']);        
        }
        else
        {
            print("<pre>child b".$_SESSION['counter']." was not found!\n</pre>");
        }
    }
    $cRoot->render();
?>


het 'werkt' dus door op F5/refresh te rammen. het script 'zoekt' (heel lafjes maar 1 laag diep) een node aan de hand van z'n naam uit de hierarchie, returned die by reference (daar zat em de kneep), veranderd iets aan de naam van die node, die dus in de hierarchie mee veranderd. Heel normaal voor Java-coders maar met PHP lekker tricky met &nnetjes... gelukkig wordt dit in PHP5 allemaal wat voor de hand liggender...