Avatar billede baileys Nybegynder
18. april 2005 - 13:21 Der er 9 kommentarer og
2 løsninger

Fejl ved sæt af class-variabler

Jeg har et problem med følgende:

//dto.php

class projectDto
  {
    var $id;
    var $name;
    var $description;
    var $supervisor;
    var $startDate;
    var $state;
   
    function projectDto()
    {
      global $supervisor;
     
      $supervisor = new userDto();
    }
  }

// projectfunctions.php

function projectGetById($projectId)
    {
      global $dbFunctions, $userFunctions;
     
      $projectDto = new projectDto();
     
      $result = $dbFunctions->query("select Id, Name, Description, Supervisor, StartDate, State from tblProject where Id = $projectId");
      if ($result)
      {
        $row = mysql_fetch_assoc($result);
       
        $projectDto->$id = $row["Id"];
        $projectDto->$name = $row["Name"];
        $projectDto->$description = $row["Description"];
        $projectDto->$supervisor = $userFunctions->userGetById($row["Supervisor"]);
        $projectDto->$startDate = $row["StartDate"];
        $projectDto->$state = $row["State"];
       
        print_r($projectDto);
       
        return $projectDto;
      }
    }

dto.php er inkluderet i projectfunctions.php

Jeg har tjekket ar $row indeholder alle relevante oplysninger - de bliver korrekt hentet fra databasen.

print_r($projectDto); giver følgende:

projectdto Object ( [id] => [name] => [description] => [supervisor] => [startDate] => [state] => [] => 1 )

Problemet er, at når jeg vil hente f.eks. $projectDto->$name får jeg bare retureret "1".

Hvad kan det skyldes?
Avatar billede barklund Nybegynder
18. april 2005 - 13:25 #1
Det hedder bare:

$projectDto->id

Og ikke:

$projectDto->$id

:)

--
Morten Barklund
Avatar billede cpfrande Nybegynder
18. april 2005 - 13:30 #2
Halløjsa,

Normalt ville man nok bruge set-metoder i sin klasse, når man ligger informationer ind i sin klasse, fremfor at sætte det ind i variablen direkte.

Et forslag kunne også være at gøre det direkte. Altså: $projectDto = new projectDto($id, $name, $description, $supervisor, $startDate, $state)

Fejlen kan jeg dog ikke lige se. Sikker på at det bliver ordentlig gemt i din klasse?
Når jeg selv koder vha. OOP, så skriver jeg f.eks. $this->variabel = value;
Du vælger at skrive $this->$variabel = value; - mon det kan have en betydning? Vil skyde på det er ligemeget udenfor klassen.

Generelt er det et godt kodningsprincip at sætte variabler i en klasse via SET-metoder, fremfor direkte!

- Kristian
Avatar billede baileys Nybegynder
18. april 2005 - 13:34 #3
Bruger jeg normalt også ved andre sprog, men primært brug af indbyggede get/set-metoder på properties - understøtter php noget ligenende? Eller er jeg nød til at lave funktioner som setId, getId, setName, getName osv?
Avatar billede cpfrande Nybegynder
18. april 2005 - 13:37 #4
Halløjsa,

Du er "nød" til at lave metoder/funktioner, der gør det. Gør man primært også, fremfor at sætte dem direkte.

- Kristian
Avatar billede barklund Nybegynder
18. april 2005 - 13:41 #5
Du kan "lidt" - dog lidt besværligt:

http://dk2.php.net/manual/da/language.oop5.overloading.php

--
Morten Barklund
Avatar billede baileys Nybegynder
18. april 2005 - 13:43 #6
Jeg takker jer begge to - så hvis i lige smider et svar, er der points
Avatar billede barklund Nybegynder
18. april 2005 - 13:47 #7
Men var det korrekt, hvis du fjernede dine ekstra dollartegn?
Avatar billede cpfrande Nybegynder
18. april 2005 - 13:47 #8
Jep, det fik vi aldrig svar på? :-) Virkede det?

- Kristian
Avatar billede baileys Nybegynder
18. april 2005 - 13:58 #9
Det virkede uden de ekstra dollar-tegn - det er år siden jeg har rodet med PHP, så der er lige enkelte ting der skal opfriskes :)

Men så snart tiden byder på det, vil jeg ændre tilgangen til funktioner istedet.
Avatar billede barklund Nybegynder
18. april 2005 - 14:04 #10
Tark for points :)
Avatar billede cpfrande Nybegynder
18. april 2005 - 14:39 #11
Tak for points! :-)
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