[ tiranin @ 20.04.2005. 19:21 ] @
Pre dva dana sam počeo da učim PHP i zaglupio sam se sa jednostavnim (?) problemom.
Pokušao sam da napravim jednostavnu hijerarhiju tipa otac-dete, a da sve očeve smestim u neku kolekciju. I do nekog dela mi radi kako treba, a negde mi članovi niza nestanu.
Da ne bih zbunjivao ovim uvodnim tekstom prilažem ceo kod.
Code:

<?php
class Baza{
    var $niz;
    function Baza(){
        $this->niz = array();
    }
    function add($o) {
        $this->niz[] = $o;
    }
   
    function getByNum($num){
        if($num < 0)
                $num = 0;
        $broj = count($this->niz);
        if($num > $broj -1)
                    $num = $broj - 1;
        if(($this->niz[$num] != NULL))
           return $this->niz[$num];
        else
            return FALSE;
    }
}
class Otac{
    var $deca;
    var $datum;
    var $plata;
    function Otac($d, $c){
        $this->deca = array();
        $this->datum = $d;
        $this->plata = $c;
    }
    
    function add($dete){
        $this->deca[] = $dete;
        $cnt = count($this->deca);
        $qq = $this->deca[$cnt - 1];
        $ww = $this->getDete($cnt - 1);        // radi testiranja
        echo '<br>add dete='.$qq->ime.'=='.$ww->ime;  //radi OK
        echo '***'.$this->getBrojDece();        //
    }

    function getDete($num){  //ne gledati jer dovde i ne dolazi
            if($num < 0)
                $num = 0;
        $broj = count($this->deca);
        if($num > $broj -1)
            $num = $broj - 1;
        if(isset($this->deca[$num]))   
            return $this->deca[$num];
        else
            return FALSE;
      }
    
    function getBrojDece(){
        echo '<br>broj='.count($this->deca);  // u prvoj fazi radi,a posle ne
        $cnt = count($this->deca);
        return $cnt;    
    }
    
}

class Dete{
    var $ime;
    var $datum;
    var $napomena;
    function Dete($a, $d, $np = 'xx'){
        $this->ime = $a;
        $this->datum = $d;
        $this->napomena = $np;
    }
}

function puniSve(){
    $baza = new Baza();
//1. otac
    $o = new Otac('30.2.2005.','3000.00');
    $baza->add($o);
    $l = new Dete('Panteilija','23.2.2005.');
    $o->add($l);
    $l = new Dete('Jevrem','23.2.2005.');
    $o->add($l);
    $l = new Dete('Ambrozije','23.2.2005.');
    $o->add($l);
//2  otac
    $o = new Otac('22.2.2005.','5000.00');
    $baza->add($o);
    $l = new Dete('Sofronije','23.2.2005.');
    $o->add($l);
    $l = new Dete('Trpimir','23.2.2005.');
    $o->add($l);
    return $baza;
}
?>

<?php

    $baza = puniSve();
    $currIndex = 0;
    echo '<br><b>Napunjeno!!</b>';
    $otac = $baza->getByNum($currIndex) or die('Neuspelo dobijanje oca');
    echo '<br>Otac='.$otac->datum.'==='.$otac->plata;
//  dovde radi kako treba
// a dalje nece

// razne varijante i nista ne prolazi
    $child = $otac->deca;
    echo '<br>$child='.$child;
    $ccc = count($child);
    echo '<br>broj  ='.$ccc;
    $br = $otac->getBrojDece() or die('Neuspelo dobijanje broja');
    echo '<br>broj  ='.$br;
    for($i = 0; $i < $br; $i++){
        $dd = $otac->getDete($i);
        echo '<br>'.$dd->ime.'--'.$dd->datum;
    }
    
?>

Stavio sam neke komentare da bude jasnije. Preko funkcije puniSve() kreiram sve objekte i dodam ih nadređenim, koji ih čuvaju u nizu.
Par echo naredbi je tu da pratim šta se dešava i punenje mi izgleda OK.
Kada hoću posle da ih povlačim, uspem samo da uzmem objekat Otac iz klase Baza, i lepo ispišem njegove atribute, ali kada hoću da uzmem niz njegove dece ne uspevam.
Verovatno sam oćoravio pa ne vidim koju glupost sam napravio, pa molim strpljive posetioce da mi otvore oči.
Hvala
[ m4j3v1c4 @ 22.04.2005. 15:15 ] @
mrzi me da testiram tudje skripte, koristi vardump($varijabla) u razlicitim dijelovima kako bi provjerio da li funkcije odradjuju posao kako treba, da li se dodjeljuju vrijednosti itd itd. tako ces najlakse da skontas gdje si "promasio".
[ tiranin @ 25.04.2005. 08:51 ] @
Evo šta je bilo posredi:
Ne razmišljajući o referencama (mnogo bolje znam Javu, pa sam olako shvatio PHP objekte) ja sam prvo kreirao objekat Otac, stavio ga u Bazu, a onda njemu dodavao objekte klase Dete. Pošto se po defaultu, ne prenose reference objekata, već se pravi interna kopija (bar tako pročitah negde), nakon stavljanja objekta Otac u Bazu, moje dalje dodavanje objekata Dete, je radilo sa orginal objektom, a ne sa onom kopijom koja je postala deo objekta Baza.
Dovoljno je bilo samo da promenim redosled, pa da prvo dodam objekte klase Dete, objektu Otac, a da tek nakon tih dodavanja stavim objekat Otac u Bazu i sve radi kako treba.
Pravilnije rešenje bi bilo da se prosleđuju refernce, ali to ću kasnije kada malo boljem ispečem PHP.
A, ako neko ima savet po ovom pitanju, hvala unapred.
[ Vuk Nikolić @ 27.04.2005. 18:55 ] @
pogledao sam samo na brzinu, zar ne bi trebao kad dodajes u niz:
function add($o) {
$this->niz[] = $o;
}

da dodajes na odredjeno mesto u nizu tipa %this->[$i]=$o;
pri cemu ti je $i broj elementat u nizu (ili ako se dobro secam to je count($this->niz))
[ tiranin @ 29.04.2005. 10:52 ] @
Citat:
green day: pogledao sam samo na brzinu, zar ne bi trebao kad dodajes u niz:
function add($o) {
$this->niz[] = $o;
}

da dodajes na odredjeno mesto u nizu tipa %this->[$i]=$o;
pri cemu ti je $i broj elementat u nizu (ili ako se dobro secam to je count($this->niz))

Ne, jer
Code:
$this->niz[] = $o;

dodaje na kraj niza, tj. automatski radi ono što ti predlažeš, ali to sve skupa nije uzrokovalo problem već prenos argumenata by value ili by reference ....
[ Vuk Nikolić @ 29.04.2005. 14:52 ] @
ok, sorry. (navike iz c++)
[ tiranin @ 29.04.2005. 16:24 ] @
Citat:
green day: ok, sorry. (navike iz c++)

Potpuno te razumem, i ja sam u ovom problemu jer me Java razmazila kada razmišljam o objektima.
[ Vuk Nikolić @ 29.04.2005. 19:02 ] @
ja sad radim javu na faksu... pa onda kad pomesam sve jezike... nikad bolje...