Avatar billede netkoen Nybegynder
21. december 2007 - 21:31 Der er 19 kommentarer og
1 løsning

Fra array til object - hvordan?

//Object både jeg senere opretter flere objekter af
class boat
{
    //Her er vores variabler, som de står i vores klassediagram.
    private $boat_id;
    private $number;
    private $name;
    private $motor;
    private $crewsize;
   
    function __construct($boatid, $number, $name, $motor, $crewsize)
    {
        $this->boat_id = $boatid;
        $this->number = $number;
        $this->name = $name;
        $this->motor = $motor;
        $this->crewsize = $crewsize;
    }
}
//Udtræks funktion fra database
public function getBoat()
    {
          $sql = "SELECT * FROM boat";
        $result = mysql_query($sql) or die(mysql_error());
        while($row = mysql_fetch_assoc($result)) {       
            $tempBoat=new boat($row['boat_id'],$row['number'],$row['name'],$row['motor'],$row['crew_size']);       
            $Boats[]=$tempBoat;
        }
        return $Boats;
    }


<?php

//Viser oversigt over samtlige både
if(!isset($_GET['boat_id']) && !isset($_GET['observation_id']))
{
    echo "<table border='1' width='450'>
            <tr>
                <th colspan='5' align='center'>Både</th>
            </tr>";
           
    for($counter = 0; $counter <= count($boat_array); $counter += 1)
    {
        $boat = new broker_boat();
        $boat_array[] = $boat->getBoat();
        echo "<tr>
                <td width='100' align='left'>Bådsnavn</td>
                <td width='100' align='left'>".$boat_array[$counter]->getVar('name')."</td>
                <td width='100' align='left'>Modelnr</td>
                <td width='100' align='left'>".$boat_array[$counter]->getVar('number')."</td>
                <td width='50' align='center'><a href='damagelogUI.php?boat_id=".$boat_array[$counter]->getVar('boat_id')."'>Se observationer</td>
            </tr>";
    }
}
?>

Problemet ligger i ovenstående udprintningsscript. Jeg kan ikke bruge metodekald fra det hentet boat objekt fra arrayet boat_array.

Betydende at kaldet $boat_array[$counter]->getVar('boat_id') laver en fatal error. "can´t call funktion on a non-objekt"

Jeg har søgt, jeg ved ikke hvor mange sider, igennem uden held. Nogen der har en løsning på hvorledes dette kan gøres.

Lige et sidste spørgsmål.

Classen boat som fremgår først i spørgsmålet. Hvis jeg ønsker at oprettet et nyt objekt af denne, men ikke gider at sætte noget i konstruktøren, er der så nogen smart måde at gøre det på?
Har tidligt se folk lave fx $boat = new boat; Men tvivler på det virker.

Håber nogen kan komme med nogen gode svar

På forhånd tak

Hilsen Daniel
Avatar billede nielle Nybegynder
21. december 2007 - 22:05 #1
Det er et objekt af klassen "broker_boat":

$boat = new broker_boat();

du opretter.

Den klasse du viser, og den hvor at getBoat() fiunktonen findes i, hedder i midler tid bare "boat".
Avatar billede netkoen Nybegynder
22. december 2007 - 12:24 #2
Sorry det er mig der har lagt teksten ind lidt dårligt... Funktionen getBoat ligger faktisk i klassen brokerboat, det er bare mig der ikke har vist det ordentligt.

Problemet er stadig som ovenstående.
Avatar billede nielle Nybegynder
22. december 2007 - 12:36 #3
Prøv at rette til:

    //Udtræks funktion fra database
    public function getBoat()
    {
        $sql = "SELECT * FROM boat";
        $result = mysql_query($sql) or die(mysql_error());

        $Boats = array();  // HER!
        while ($row = mysql_fetch_assoc($result)) {       
            $tempBoat = new boat($row['boat_id'],$row['number'],$row['name'],$row['motor'],$row['crew_size']);       
            $Boats[] = $tempBoat;
        }
        return $Boats;
    }
Avatar billede netkoen Nybegynder
22. december 2007 - 12:58 #4
det vil ikke virke, det er jo lige præcis kaldet "boat->getBoat()" der returnere et array indeholdende flere objekter af boat. Men hentes boat objektet ud af arrayet, opfatter php ikke objektet som et objekt.
Avatar billede nielle Nybegynder
22. december 2007 - 13:11 #5
Din nuværende kode fejler fordi at den ikek returnere et array - det er det at HER linjen i det ovenstående fikser.
Avatar billede nielle Nybegynder
22. december 2007 - 14:33 #6
... men fejlbeskeden komer nok først og fremmest fordi at din for-løkke løber lidt for langt:

$broker_boat_obj = new broker_boat();
$boat_array = $broker_boat_obj->getBoat();

for ($counter = 0; $counter < count($boat_array); $counter += 1)
{
    echo "<tr>
        <td width='100' align='left'>Bådsnavn</td>
        <td width='100' align='left'>" . $boat_array[$counter]->getVar('name') . "</td>
        <td width='100' align='left'>Modelnr</td>
        <td width='100' align='left'>" . $boat_array[$counter]->getVar('number') . "</td>
        <td width='50' align='center'><a href='damagelogUI.php?boat_id=" . $boat_array[$counter]->getVar('boat_id') . "'>Se observationer</td>
        </tr>";
}
Avatar billede netkoen Nybegynder
22. december 2007 - 15:50 #7
Hej igen

Det har overhovedet ikke noget med løkken at gøre.

Det har noget at gøre med hvorledes PHP benytte objekt orienteret og hvorledes man transportere objekter i et array.

for ($counter = 0; $counter < count($boat_array); $counter += 1)
{
    echo "<tr>
        <td width='100' align='left'>Bådsnavn</td>
        <td width='100' align='left'>(FEJLEN SKER HER)" . $boat_array[$counter]->getVar('name') . "</td>
        <td width='100' align='left'>Modelnr</td>
        <td width='100' align='left'>(FEJLEN SKER OG HER)" . $boat_array[$counter]->getVar('number') . "</td>
        <td width='50' align='center'><a href='damagelogUI.php?boat_id=" . $boat_array[$counter]->getVar('boat_id') . "'>Se observationer</td>
        </tr>";
}
Avatar billede nielle Nybegynder
22. december 2007 - 16:05 #8
Hvis det intet har med det at gøre, hvordan kan det så være at det virker her os mig?
Avatar billede netkoen Nybegynder
22. december 2007 - 16:09 #9
det kommer jo helt an på hvordan du har gjort..

Hvis du har et array indeholdende objekter af boat, som du kan udtrækker objekter fra og benytte funktionerne fra objektet, så vil jeg meget gerne vide hvorledes du laver metode kaldet "getVar($var)" i boat.
Avatar billede nielle Nybegynder
22. december 2007 - 16:17 #10
Her er min mockup-kode:

<?
class boat
{
    var $boat_id;
   
    function boat($boatid)
    {
        $this->boat_id = $boatid ;
    }

    function getVar($varName)
    {
        // Jeg er for doven til at lave for alle dine variable...
        return $this->boat_id;
    }
}

class broker_boat
{
    function getBoat()
    {
        $boats = array();

        // Simmulere hentning af 5 poster fra databasen.
        for ($i=0; $i<5; $i++)
        {
            $boats[] = new boat($i + 1000);
        }

        return $boats;
    }
}

$broker_boat_obj = new broker_boat();
$boat_array = $broker_boat_obj->getBoat();

for ($counter = 0; $counter < count($boat_array); $counter++)
{
    echo "<tr>
        <td width='100' align='left'>Bådsnavn</td>
        <td width='100' align='left'>" . $boat_array[$counter]->getVar('name') . "</td>
        <td width='100' align='left'>Modelnr</td>
        <td width='100' align='left'>" . $boat_array[$counter]->getVar('number') . "</td>
        <td width='50' align='center'><a href='damagelogUI.php?boat_id=" . $boat_array[$counter]->getVar

('boat_id') . "'>Se observationer</a></td>
        </tr>";
}
?>

Vi kan diskutere delajerne om de enkelte funktioner; men som koden viser, er der ingen problemer i at have objekter af en eller anden klasse i et array og kalde klassernes funktion direkte via array'et.
Avatar billede netkoen Nybegynder
22. december 2007 - 16:41 #11
Det vil sige at du hvis du laver følgende:

$boat_array = $broker_boat_obj->getBoat();
dernæst
echo $boat_array[0]->getVar('boat_id');

Så får du printet tallet 1000???

Hvis dette er tilfældet, så prøv at sætte flere variabler ind i boat og se om det stadig virker.

Jeg sidder desværre på arbejdet, så har ingen mulighed for at teste selv.

Stiller mig bare meget uforståelig overfor at du godt kan lave et metodekald på et objekter der lige er blevet trukket ud af et array.

Det har ikke været muligt for mig.
Avatar billede nielle Nybegynder
22. december 2007 - 17:15 #12
Hvis du er på arbejde, har du så haft mulighed for at afprøve min kode?

Jeg kan i hvert fald konstatere at den fejl du melder, ville følge som resultat af de to fejlrettelser jeg har angivet i 22/12-2007 12:36:03 og i 22/12-2007 14:33:06. Uden dem, har du enten slet ikke noget array, eller også løber løkken ud over enden af arrayet. I begge tilfælde kaldes getVar() på noget som ikke er et objekt. Hvsi jeg bevist fremprovokere en af de to fejltilstande får jeg nettop den fejlbesked du beskriver.

I mellemtiden har jeg tilføjet et par værdier til koden. resultatet kan ses her:

http://www.mindsqualls.net/php/e811455.php

Og selve koden her:

<?
class boat
{
    var $boat_id;
    var $name;
    var $number;
   
    function boat($boatid, $name, $number)
    {
        $this->boat_id = $boatid;
        $this->name = $name;
        $this->number = $number;
    }

    function getVar($varName)
    {
        switch ($varName)
        {
            case 'boat_id' : return $this->boat_id;
            case 'name' : return $this->name;
            case 'number' : return $this->number;
            default : return false;
        }
    }
}

class broker_boat
{
    function getBoat()
    {
        $boats = array();

        // Simmulere hentning af 5 poster fra databasen.
        for ($i=0; $i<5; $i++)
        {
            $boats[] = new boat($i + 1000, "bådnavn$i", "HMS E$i");
        }

        return $boats;
    }
}

$broker_boat_obj = new broker_boat();
$boat_array = $broker_boat_obj->getBoat();

echo "<table>";
for ($counter = 0; $counter < count($boat_array); $counter++)
{
    echo "<tr>
        <td width='100' align='left'>Bådsnavn</td>
        <td width='100' align='left'>" . $boat_array[$counter]->getVar('name') . "</td>
        <td width='100' align='left'>Modelnr</td>
        <td width='100' align='left'>" . $boat_array[$counter]->getVar('number') . "</td>
        <td width='50' align='center'><a href='damagelogUI.php?boat_id=" . $boat_array[$counter]->getVar

('boat_id') . "'>Se observationer</a></td>
        </tr>";
}
echo "</table>";
?>

Det skal da ikke udelukkes at det virker forskelligt i forskellige versioner af PHP. Men siden at der faktisk ikke synes at være nogen mulighed for at typecaste objekter, så ville det resultere i at det nærmest var umuligt at arbejde med array-af-objekter ellers.
Avatar billede netkoen Nybegynder
22. december 2007 - 17:50 #13
Det var lige godt pokkers..

Jamen jeg må hjem og prøve.

Jeg siger mange tak for alt dit arbejde.. Lækkert du gad kigge på det.

lave lige svar halløjsa, så får du dine point.
Avatar billede nielle Nybegynder
22. december 2007 - 18:13 #14
Jeg venter nu gerne ind til at det også virker for dig. :^)
Avatar billede netkoen Nybegynder
24. december 2007 - 15:45 #15
Det vil bare ikke virke..

Nu har jeg lavet loobet om, men kører i øjeblikket forbi det og tester med følgende kode tump:

echo ".........................................................................<br>";
    print_r($boat_array);
    $boat = $boat_array[0];   
    echo "Udskriver bådsmodel: ".$boat->getNumber();
           
    die();

Resultat er følgende, se link: http://sundet.netkoen.dk/New/damagelogUI.php

Udfra linket ses det at arrayet er fyldt med de rigtig informationer, men at den stadig ikke opfatter "$boat" som et objekt. Pokkers generende

Nogen idé?
Avatar billede nielle Nybegynder
25. december 2007 - 09:19 #16
Så vidt jeg kan se er din $boat_array er array med een post. Denne ene post er så igen et array af boat-objekter. Jeg ved ikke lige hvordan du har fået lagt det ind som et array-i-et-array, men din kode skal i hvert fald rettes til:

echo ".........................................................................<br>";
print_r($boat_array);
$boat = $boat_array[0][0];  // <----- Her!
echo "Udskriver bådsmodel: ".$boat->getNumber();
die();

- hvis den skal passe sammen med din datastruktur.
Avatar billede nielle Nybegynder
07. januar 2008 - 17:54 #17
Er du kommet vidre med denne her?
Avatar billede netkoen Nybegynder
07. januar 2008 - 20:59 #18
Sorry mester jeg har sgu helt glemt dig.

Det må du sgu undskylde. Tusind tak for hjælpe, det var fanme fordi jeg havde lavet dobbeltarray det havde jeg ikke set, selvom jeg lavede print_r.

Så bare giv dit svar så er pointerne dine og igen tusind tak for hjælpen
Avatar billede nielle Nybegynder
07. januar 2008 - 21:06 #19
Svar :^)
Avatar billede netkoen Nybegynder
08. januar 2008 - 13:56 #20
Done :D
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester