vraagje over ophalen van informatie en in een tabel zetten D.M.V OOP

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Henk de Vries

Henk de Vries

07/10/2012 01:44:27
Quote Anchor link
Hallo mede PHPers,

Ik ben een beetje OOP PHP aan het uitproberen, en daar heb ik een vraag over.
Op het moment wil ik een simpel ding voor elkaar krijgen en dat is het volgende:
Ik heb een tabel in de database met de velden id en merk, en deze informatie wil ik uitlezen DMV een functie in de class (en dit in een tabel stoppen).

Ik heb het voor elkaar gekregen dat de informatie uit de database wordt gehaald, er een object van wordt gemaakt, en in een tabel wordt gezet. Maar ik heb de opbouw van de tabel in de functie zelf gedaan, en Dit is waarschijnlijk niet zoals het hoort. Dit omdat de functie nu maar voor 1 ding kan worden gebruikt, en dat is het ophalen van de informatie, en deze informatie wordt dan in een tabel getoond. Dit is te functie waar ik het over heb:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
public static function get_all_merken(){
        
    $query = "select * from `merk`";
    
    echo "<Table width='200' border=1>";
    
    foreach ( self::find_by_sql($query) as $merk){
        echo "<tr>";
        echo "<td>$merk->id</td>";
        echo "<td>$merk->merk</td>";
        echo "<tr>";
    }

    echo "</table>";
    
}

?>


Ik heb het al geprobeerd om de self::find_by_sql($query) in een variabele te stoppen en deze te returnen. Maar als ik bijv $merk->id wil gebruiken, krijg ik de error dat ik geen private velden buiten de class kan gebruiken (wat logisch is, omdat ik deze private heb gemaakt in de class).

Heeft iemand een idee hoe ik dit op een nette manier kan doen (ik weet namelijk niet of dit is toegestaan)? dit omdat ik zelf nog niet veel ervaring heb met OOP, en het super graag wil leren.

alvast enorm bedankt!!
Gewijzigd op 07/10/2012 01:55:43 door Henk de Vries
 
PHP hulp

PHP hulp

23/11/2024 05:26:08
 
Frank Nietbelangrijk

Frank Nietbelangrijk

07/10/2012 02:44:19
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
class Persoon {
    private $naam;
    
    public function Persoon($naam) {
        $this->naam = $naam;
    }

    
    public function getNaam() {
        return $this->naam;
    }


    public function setNaam($naam) {
        $this->naam = $naam;
    }
    
};


$p = new Persoon("Frank");
echo $p->getNaam()."<br>";

$p->setNaam("Menno");
echo $p->getNaam()."<br>";

?>


probeer echo's in de onderliggende classes te vermijden.
beter meer kleine functies in je class dan grote met veel if else etc

self:: zul je niet zo gauw nodig hebben, gebruik voorlopig maar $this->
Gewijzigd op 07/10/2012 02:47:51 door Frank Nietbelangrijk
 
Henk de Vries

Henk de Vries

07/10/2012 19:10:22
Quote Anchor link
Hallo Frank, erg bedankt voor de feedback.

Ik heb nu de volgende code (ik laat even de hele class zien)

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
    include_once("MySQLDatabase_class.php");

    class Automerk{
    
    private $id;
    private $merk;
    
    
    public function __construct($id='',
                                $merk='')
    {

        $this->id = $id;
        $this->merk = $merk;
    }

        
        
        
    public static function find_by_sql( $query )
    {

        global $database;
        $result_set = $database->fire_query( $query );
        $merk = array();
        while ( $row = mysqli_fetch_array($result_set))
        {

            $object = new Automerk();
            $object->id = $row["id"];
            $object->merk = $row["merk"];
            $merk_array[] = $object;
        }

        return $merk_array;
    }

    
    
    public static function get_all_merken(){
            
        $query = "select * from `merk`";
        
        $result = self::find_by_sql($query);    
        return $result;
    }
    

    public static function create_table_merken(){
        
        $get_merken = self::get_all_merken();
        
        echo "<Table width='200' border=1>";
        foreach ( $get_merken as $merk){
            echo "<tr>";
            echo "<td>$merk->id</td>";
            echo "<td>$merk->merk</td>";
            echo "<tr>";
        }

        echo "</table>";
        
    }
}

?>


Ik heb er nu voor gekozen om de tabel in een andere functie te zetten. Nu kan ik door simpelweg create_table_merken() op te roepen de tabel met merken tevoorschijn halen, en kan ik de get_all_merken() voor meerdere dingen gebruiken (als ik bijvoorbeeld list items van de merken wil maken).
Ik hoop dat iemand mij feedback kan geven of ik de juiste richting op ga, of dat ik een aantal zaken moet bijschaven.

alvast thx!
Gewijzigd op 07/10/2012 19:29:32 door Henk de Vries
 
Wouter J

Wouter J

07/10/2012 20:01:36
Quote Anchor link
Nee, je gaat niet de juiste richting op. Allereerst begin je meteen met scripten en denk je waarschijnlijk niet na wat je nou precies script. Als je dit al wel doet ben je al een stapje verder in de goede richting.

In OO probeer je je applicatie zo flexibel mogelijk te maken, alles moet met een paar regels verschil of slechts met 1 klasse te veranderen aan te passen zijn. Om hiertoe te komen is er 1 hele belangrijke regel:
Elke klasse en elke method heeft maar 1 verantwoordelijkheid, zodra je bij de omschrijving wat een klasse/method doet het woordje en gebruikt splits je het op in meerdere klassen/methoden

In jou geval ga je hier flink tegenin. De automerk klasse houdt en de gegevens vast van het merk en haalt de gegevens op uit de database. Deze 2 splits je op in klassen: 1 die het automerk ophaalt uit de database/een bestand/ect. en 1 die de gegevens vast houdt. Die nieuwe klassen noemen we een DataMapper. Kijk ook eens naar deze uitleg en voorbeelden: http://www.phphulp.nl/php/forum/topic/oop-gedachtengang/85017/1/#606620 en http://www.phphulp.nl/php/forum/topic/oop-in-combinatie-met-database/81754/#580025

De verwerking van data in klassen is 1 van de moeilijkste dingen in OO en daarom zijn er heel wat oplossingen voor. Naast de DataMapper, welke ik aanraadt, wordt ook het Active Record pattern gebruikt: http://www.phphulp.nl/php/forum/topic/applicatie-naamgeving/81370/3/#578116 en ook een ORM (zoals Doctrine of Propel) en nog veel meer oplossingen.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.