Is dit goede OOP?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Yearupie Achternaamloos

Yearupie Achternaamloos

03/01/2010 12:12:00
Quote Anchor link
Hallo,

Ik ben nog maar een beginner in de wereld van OOP, daarom wil ik jullie vragen wat jullie van onderstaande codes vinden. Ik hoor graag jullie commentaar hoe het beter, sneller en korter kan met OOP.

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
class Database{
  
  public $dbh;
  protected $_hostname = "";
  protected $_database = "";
  protected $_username = "";
  protected $_password = "";
    
  public function connect(){
               
      try {
          
        $this->dbh = new PDO("mysql:host=".$this->_hostname.";dbname=".$this->_database.";",$this->_username, $this->_password);    
        return $this->dbh;    
    }

        catch(PDOException $e){
            
        echo $e->getMessage();        
    }
  }

  
  public function escape($string) {
      return quote($string, $this->dbh);  
  }

  
  public function query($query) {
          $query = $this->dbh->prepare($query);
      return $query->execute();  
  }

  
  public function fetchAssoc($result) {
      return $result->fetch(PDO::FETCH_ASSOC);
  }

  
  public function fetchObject($result) {
      return $result->fetch(PDO::FETCH_OBJ);  
  }

  
  public function numRows($result) {
      return $result->rowCount();
  }
}

class Message {
        
    private $_db;
    private $_from;
    private $_to;
    private $_subject;
    private $_message;
    
    public function __construct($db,$from,$to,$subject,$message) {
        
        $this->_db = $db;
        $this->_from = $from;
        $this->_to = $to;
        $this->_subject = $subject;
        $this->_message = $message;
    }

    
    public function send() { # bericht verzenden
            
        $sql = "INSERT INTO pm (msg_from,msg_to,subject,text,time) VALUES (".$this->_from.",".$this->_to.",'".$this->_subject."','".$this->_text."','NOW()')";
        $_db->query($sql);
    }    
}

class CheckMessage {

    private $_db;
    public $subject;
    public $text;       
    
    public function __construct($db,$subject,$text) {
        
        $this->_db = $db;
        $this->subject = $subject;
        $this->text = $text;
    }

    
    public function checkText(){ # tekst beveiligen
    
        $this->text = $_db->escape($this->text);
    $this->text = nl2br($this->text);    
    }

    
    public function getText(){ # text ophalen
    
        return $this->text;
    }

    
    public function checkSubject(){ # titel beveiligen
    
        $this->subject = $_db->escape($this->subject);  
    }

    
    public function getSubject(){ # titel ophalen
    
        return $this->subject;
    }
}

?>


Een bericht verzenden:
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
<?php
# id verzender
$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht";


# De database class wordt geïnstantieerd
$db = New Database();
# Database verbinding maken
$db->connect();


# De controle class wordt geïnstantieerd
$checkmessage = New CheckMessage($db,$subject,$text);
# De text wordt gecontroleerd
$checkmessage->checkText();
# Het onderwerp wordt gecontroleerd
$checkmessage->checkSubject();'

# De verzend class wordt geïnstantieerd
$message = New Message($db,$from,$to,$checkmessage->getText(),$checkmessage->getSubject);
# Bericht word verzonden
echo $message->send();
?>
Gewijzigd op 01/01/1970 01:00:00 door Yearupie Achternaamloos
 
PHP hulp

PHP hulp

16/05/2021 09:55:30
 
Joren de Wit

Joren de Wit

03/01/2010 13:23:00
Quote Anchor link
Het gaat op een aantal punten nog niet helemaal goed:

Om te beginnen bouw je met je Database class een extra laag over de PDO class heen, wat op zich ook al een database class is. Bovendien voeg je er geen nieuwe functionaliteit aan toe, dus waarom gebruik je dan niet gewoon PDO als database class?

Ten tweede is de send() method van je Message class niet op zijn plaats. Een bericht zou niet moeten weten hoe hij zichzelf naar de database moet schrijven, maar enkel zijn eigen eigenschappen moeten kennen en kunnen bepalen. Een Message weet niets over een database, en kan dus ook zeker niet met een Database object werken. Deze method zou ik eerder verwachten in een Message_Controller class.

Wat wil je tenslotte bereiken met je CheckMessage class? Ik verwachtte eigenlijk een soort Validator class aan de naam te zien, maar dat bleek alles behalve het geval. Jij hebt er methods in geprogrammeerd die je nooit tegelijkertijd toe hoort te passen op een bericht. Het escapen is een verantwoordelijkheid van de Database class voordat de query uitgevoerd wordt en nl2br() zou ergens in een method moeten staan die voor de presentatie in HTML zorgt. Maar in ieder geval niet hier en zeker niet voordat je de gegevens naar de database schrijft.
 
Yearupie Achternaamloos

Yearupie Achternaamloos

03/01/2010 15:13:00
Quote Anchor link
Oke, ik ben een tijdje aan het werk geweest en hem een aantal dingen aangepast.

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
<?php
class Database{
  
  public $dbh;
  protected $_hostname = "";
  protected $_database = "";
  protected $_username = "";
  protected $_password = "";
    
  public function connect(){
               
      try {
          
        $this->dbh = new PDO("mysql:host=".$this->_hostname.";dbname=".$this->_database.";",$this->_username, $this->_password);    
        return $this->dbh;    
    }

        catch(PDOException $e){
            
        echo $e->getMessage();        
    }
  }
}


class Message_Controller {
        
    private $_db;
    private $_from;
    private $_to;
    private $_subject;
    private $_message;
    
    public function __construct($db,$from,$to,$subject,$message) {
        
        $this->_db = $db;
        $this->_from = $from;
        $this->_to = $to;
        $this->_subject = $subject;
        $this->_message = $message;
    }

    
    public function saveMessage() { # bericht opslaan
            
        $sql = "INSERT INTO pm (msg_from,msg_to,subject,text,time) VALUES (:msg_from, :msg_to, :subject, :text,'NOW()')";
        $query = $_db->prepare($sql);
        $query->bindvalue(':msg_from',$this->_from,PDO::PARAM_INT);
        $query->bindvalue(':msg_to',$this->_to,PDO::PARAM_INT);
        $query->bindvalue(':subject',$this->_subject,PDO::PARAM_STR);
        $query->bindvalue(':text',$this->_text,PDO::PARAM_STR);
        $query->execute();
    }
}


class Message {

    private $_db;
    public $id;
    
    public $from;
    public $to;
    public $subject;
    public $message;
    
    public function __construct($db,$id) {
        
        $this->_db = $db;
        $this->id = $id;
    }

    
    public function setMessageInfo() {
    
        # Zoekt bericht met het id
        $sql = "SELECT msg_from,msg_to,subject,message FROM pm WHERE id = ?";    
        $query = $this->db->prepare($sql);
        $query->bindvalue(1,$this->id,PDO::PARAM_INT);
        $query->execute();
        $row = $query->fetch(PDO::FETCH_ASSOC);
        
        # Set alle vars
        $this->from = $row['msg_from'];
        $this->to = $row['msg_to'];
        $this->subject = $row['subject'];
        $this->message = $row['message'];
    }

    
    public function getFrom() {
    
        return $this->from;    
    }

    
    public function getTo() {
    
        return $this->to;    
    }

    
    public function getSubject() {
    
        return $this->subject;    
    }

    
    public function getMessage() {
    
        return $this->message;    
    }    
}


class Check_Message {

    private $_db;
    private $_to;
       
    
    public function __construct($db,$to) {
        
        $this->_db = $db;
        $this->_from = $from;
        $this->_to = $to;
    }

    
    public function checkFrom() {
    
        $sql = "SELECT id FROM tbl_users WHERE id = ?";
        $from = prepare($sql);
        $from->bindvalue(1,$this->_from,PDO::PARAM_INT)
        $from->execute();
        if(count($from->fetchAll() > 0)) {
            
            # User bestaat
            return true;
        }

        else{
            
            # User bestaat niet
            return false;
        }
    }
}

?>


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
<?php
# id verzender
$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht";


# De database class wordt geïnstantieerd
$db = New Database();
# Database verbinding maken
$db->connect();


# De controle class wordt geïnstantieerd
$checkmessage = New Check_Message($db,$to,$subject,$text);

# Controleren of gebruiker bestaat
if(!$checkmessage->checkFrom()) {

    echo "Verzenden mislukt: gebruiker bestaat niet.";    
}


# Controleren of titel niet leeg is
elseif(empty($subject)) {

    echo "Je hebt geen titel ingevuld!";    
}


# Controleren of bericht niet leeg is
elseif(empty($text)) {

    echo "Je hebt geen bericht ingevuld!";    
}

# Bericht opslaan
else {

    # De Message_Controller class wordt geïnstantieerd
    $message = New Message_Controller($db,$from,$to,$checkmessage->getText(),$checkmessage->getSubject);
    # Bericht word verzonden
    echo $message->saveMessage();        
}

?>
 
Joren de Wit

Joren de Wit

03/01/2010 15:21:00
Quote Anchor link
Het klopt nog niet helemaal. Ook het ophalen van de gegevens van een Message uit de database, zou een taak moeten zijn van de Message_Controller. Als die gegvens opgehaald zijn, kan daarmee vervolgens een nieuw Message object gemaakt worden. Op die manier weet een Message enkel dingen over zichzelf.

Je gaat de goede kan op, maar er zitten nog wel een aantal denkfouten in. Vraag je bij alle properties en methods van een class eens af of die wel bij die class thuis horen. Een propertie setMessageInfo() in de Message class kan zeker, maar daar wil je geen dingen meer uit de database moeten halen.

ps. Die Database class snap ik nog steeds niet. Waarom gebruik je niet enkel de PDO class en dus in plaats van
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$db
= new Database(...);
?>

gewoon
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$db
= new PDO(...);
?>

gebruiken?
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
 
Yearupie Achternaamloos

Yearupie Achternaamloos

03/01/2010 18:38:00
Quote Anchor link
Ik heb de database class eruit gehaald en daarvoor in de plaats gewoon de PDO class gebruikt. Na dit voorbeeld van jou zie ik pas in dat PDO ook gewoon een class is.

Ook heb ik alle database verbindingen naar de Message_Controller gezet.
Voor de rest is er nog een Ubb class in gekomen, alleen weet ik niet zeker of het een goede naam is. Ook heb ik nu de mogelijkheid toegevoegd dat je bericht kan lezen.

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
<?php

class Message_Controller {
        
    private $_db;
    
    public function __construct($db) {
        
        $this->_db = $db;
    }

    
    public function saveMessage($from,$to,$subject,$text) { # bericht opslaan
            
        $sql = "INSERT INTO pm (msg_from,msg_to,subject,message,time) VALUES (:msg_from, :msg_to, :subject, :text,NOW())";
        $query = $this->_db->prepare($sql);
        $query->bindvalue(':msg_from',$from,PDO::PARAM_INT);
        $query->bindvalue(':msg_to',$to,PDO::PARAM_INT);
        $query->bindvalue(':subject',$subject,PDO::PARAM_STR);
        $query->bindvalue(':text',$text,PDO::PARAM_STR);
        $query->execute();
    }

    
    public function getMessage($id) { # bericht ophalen
    
        $sql = "SELECT * FROM pm WHERE id = ?";    
        $query = $this->_db->prepare($sql);
        $query->bindvalue(1,$id,PDO::PARAM_INT);
        $query->execute();
        return $query->fetch(PDO::FETCH_ASSOC);
    }

    
    public function setStatus($id) { # bericht markeren als gelezen
    
        $sql = "UPDATE pm SET status = 1 WHERE id = ?";
        $query = $this->_db->prepare($sql);
        $query->bindvalue(1,$id,PDO::PARAM_INT);
        $query->execute();    
    }
}


class Message {

    private $_db;
    public $id;
    
    public $from;
    public $to;
    public $subject;
    public $message;
    public $date;
    
    public function __construct($db,$from,$to,$subject,$message,$date) {
        
        $this->_db = $db;
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->message = $message;
        $this->date = $date;
    }

    
    public function getFrom() {
    
        return $this->from;    
    }

    
    public function getTo() {
    
        return $this->to;    
    }

    
    public function getTime() {
    
        return $this->date;    
    }

    
    public function getSubject() {
    
        return $this->subject;    
    }

    
    public function getMessage() {
    
        return $this->message;    
    }        
}


class Check_Message {

    public $db;
    private $_to;
       
    
    public function __construct($db,$to) {
        
        $this->db = $db;
        $this->_to = $to;
    }

    
    public function checkTo() {
    
        $sql = "SELECT id FROM tbl_users WHERE id = ?";
        $from = $this->db->prepare($sql);
        $from->bindvalue(1,$this->_to,PDO::PARAM_INT);
        $from->execute();
        if(count($from->fetchAll() > 0)) {
            
            # User bestaat
            return true;
        }

        else{
            
            # User bestaat niet
            return false;
        }
    }
}


class Ubb {
    
    public $text;
    public $smilies = array(
    ':)'    =>     "smile.gif",
    ':('    =>     "sad.gif",
    ':D'    =>     "biggrin.gif",
    ':d'    =>     "biggrin.gif",                
    ':p'    =>     "tongue.gif",
    ':P'    =>     "tongue.gif",
    ':-)'    =>     "unsure.gif",
    '(A)'    =>     "angel.gif",
    '(a)'    =>     "angel.gif",
    ':s'    =>     "blink.gif",
    ':S'    =>     "blink.gif",
    ':$'    =>     "blush.gif",
    '(h)'    =>     "cool.gif",
    '(H)'    =>     "cool.gif",
    ':\'('    =>     "cry.gif",
    '--'    =>     "dry.gif",
    '-_-'    =>     "dry.gif",
    '^^'    =>     "happy.gif",
    '^_^'    =>     "happy.gif",
    ':|'    =>     "huh.gif",
    ';d'    =>     "laugh.gif",
    ';D'    =>     "laugh.gif",
    ':@'    =>     "mad.gif",
    ':o'    =>     "ohmy.gif",
    ':O'    =>     "ohmy.gif",
    ':0'    =>     "ohmy.gif",
    '8S'    =>     "woot.gif",
    '8s'    =>     "woot.gif",
    '8)'    =>     "wacko.gif",
    ';)'    =>     "wink.gif",
    );

    
    public function __construct($text) {
        
        $this->text = $text;
    }

    
    public function addCodes() { # maakt de ubb codes
    
        $text = $this->text;
        # verander tekens in html
        $text = htmlspecialchars($text);
        # voegt enters toe
        $text = nl2br($text);
        foreach($this->smilies AS $find => $replace)
    {

        # voegt de smilies toe
        $text = str_replace(htmlentities($find), "<img src='images/smileys/".$replace."' alt='smileys' />", $text);  
      }

      # maakt plaatjes
      $text = preg_replace("#\[img\](http(s)?://)([a-zA-Z0-9\-\.,\?!%\*_\#:;~\\&$@\/=\+]+)\[/img\]#", "<img src='\\1\\3' />", $text);
      # Maakt gekleurde letters
      $text = preg_replace("#\[color=(\#[0-9A-F]{6}|[a-z\-]+)\](.*?)\[/color\]#si", "<font color='\\1'>\\2</font>", $text);
      
      return $text;
    }
}

?>

Database:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
# Database gegevens
$hostname = "";
$database = "";
$username = "";
$password = "";

# De database wordt geïnstantieerd
$db = New PDO("mysql:host=".$hostname.";dbname=".$database.";",$username, $password);
?>


Bericht verzenden:
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
<?php
/* ---------- Bericht verzenden ---------- */

# id verzender

$from = 1;
# id ontvanger
$to = 10;
# onderwerp
$subject = "Mijn onderwerp";
# bericht
$text = "Mijn bericht
haha"
;


# De controle class wordt geïnstantieerd
$checkmessage = New Check_Message($db,$from);

# Controleren of gebruiker bestaat
if(!$checkmessage->checkTo()) {

    echo "Verzenden mislukt: gebruiker bestaat niet.";    
}


# Controleren of titel niet leeg is
elseif(empty($subject)) {

    echo "Je hebt geen titel ingevuld!";    
}


# Controleren of bericht niet leeg is
elseif(empty($text)) {

    echo "Je hebt geen bericht ingevuld!";    
}

# Bericht opslaan
else {

    # De Message_Controller class wordt geïnstantieerd
    $message = New Message_Controller($db);
    # Bericht word verzonden
    $message->saveMessage($from,$to,$subject,$text);    
    echo "Bericht is verzonden!";    
}

?>


Bericht lezen:
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
<?php
/* ---------- Bericht lezen ---------- */

# bericht id

$id = 20;

# De Message_Controller class wordt geïnstantieerd
$msg_control = New Message_Controller($db);
# Bericht gegevens worden opgehaald
$row = $msg_control->getMessage($id);
# Bericht als gelezen markeren
$msg_control->setStatus($id);
# De Message class wordt geïnstantieerd
$message = New Message($db,$row['msg_from'],$row['msg_to'],$row['subject'],$row['message'],$row['time']);
# De Make_Html class wordt geïnstantieerd
$ubb = New Ubb($row['message']);
# De html word gemaakt
$text = $ubb->addCodes();

# Bericht schrijven
echo "<p>Van: ".$message->getFrom()."</p>";
echo "<p>Aan: ".$message->getTo()."</p>";
echo "<p>Verzend datum: ".$message->getTime()."</p>";
echo "<p>Titel: ".$message->getSubject()."</p>";
echo "<p>bericht: ".$text."</p>";
?>
Gewijzigd op 01/01/1970 01:00:00 door Yearupie Achternaamloos
 
Joren de Wit

Joren de Wit

03/01/2010 20:07:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
# id verzender
$from = 1;
# id ontvanger
$to = 10;
?>

Ik mis hier het User object. Ik neem aan dat deze twee waarden id's van een user voorstellen, dan kun je dat natuurlijk in een User object verwerken. Bovendien ben je dan ook af van je Check_Message class, aangezien de method checkTo() gewoon een method exists() van de User class kan zijn.
 
Yearupie Achternaamloos

Yearupie Achternaamloos

03/01/2010 20:23:00
Quote Anchor link
Kan ik dit in een User class zetten?
Of zou ik dit met een User_controller class ofzoiets moeten maken?
 
Joren de Wit

Joren de Wit

03/01/2010 20:40:00
Quote Anchor link
Voor beide oplossingen vallen argumenten te verzinnen. Als je al een User_Controller (nodig) hebt, zou ik hem zeker daarin plaatsen maar als je alleen voor deze method een nieuwe class aan moet maken, kun je ook beargumenteren dat een User van zichzelf zou moeten kunnen controleren of hij bestaat.

De User_Controller zou de voorkeur hebben, waarbij de exists() method dan zelfs static gedeclareerd zou kunnen worden.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
public static function exists(User $user) {}
?>
 
Yearupie Achternaamloos

Yearupie Achternaamloos

03/01/2010 20:54:00
Quote Anchor link
Graag zou ik de User_Controller later uitbreiden, dus daarom zal ik voor die naam kiezen. Als ik hem static wil gebruiken op de volgende manier geeft hij een foutmelding dus ik gebruik hem denk ik dan gewoon:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
if(!User_Controller($db)::exists($to))
?>

Quote:
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/www/xxx.php on line xxx


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
<?php
class User_Controller {

    public $db;       
    
    public function __construct($db) {
        
        $this->db = $db;
    }

    
    public static function exists($id) {
    
        $sql = "SELECT id FROM tbl_users WHERE id = ?";
        $from = $this->db->prepare($sql);
        $from->bindvalue(1,$id,PDO::PARAM_INT);
        $from->execute();
        if(count($from->fetchAll() > 0)) {
            
            # User bestaat
            return true;
        }

        else{
            
            # User bestaat niet
            return false;
        }
    }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Yearupie Achternaamloos
 
Joren de Wit

Joren de Wit

03/01/2010 21:06:00
Quote Anchor link
Er gaan hier twee dingen fout. Een User_Controller kan met User objecten werken, jij stopt er nu enkel het id van een user in en dat klopt niet helemaal. Verder is je aanroep van de static method niet in orde. Een klein voorbeeldje:
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
<?php
class User {
  private $_id;

  public function __construct($id) {
    $this->_id = $id;
  }
}


class User_Controller {
  private $_user;

  public function __construct($user = null) {
    if($user instanceof User) {
      $this->_user = $user;
    }

    else {
      $this->_user = $this->new();
    }
  }


  public function new() {
    // Maak een nieuw record aan voor een user in de database
    // Gebruik eventueel optionele parameters van new()
    // Tenslotte maak retourneer je een nieuw User object:

 
    return new User($id);
  }


  public static function exists(User $user) {
    // Controleer of $user bestaat en return true of false
  }
}


// Om te controleren of User met id 10 bestaat:
if(User_Controller::exists(new User(10))) {
  // User bestaat...
}
?>

Dit geeft een kleine indruk van hoe je het aan zou kunnen pakken. De new() method heb ik er ook maar bij gedaan, dat is de manier waarop je een nieuwe user aan zou kunnen maken in de database. Uiteraard kun je hier zelf meer vereiste parameters aan toevoegen.
 
Yearupie Achternaamloos

Yearupie Achternaamloos

03/01/2010 22:13:00
Quote Anchor link
Maar hoe krijg ik dan nu $db de klasse in?
Ik heb een database verbinding nodig om te kijken of de gebruiker bestaat en dat kan ik dan niet tussen haakjes achter de class doen?
 
Jelmer -

Jelmer -

03/01/2010 22:58:00
Quote Anchor link
In welke situatie wil je slechts bekijken of de user bestaat? Is dat om te controleren of de gebruikersnaam al ingenomen is? Of is dat om de controleren of het id wel klopt? En wanneer dat id klopt, waar gebruik je dat dan voor?

In het geval van "ja, ik controleer het id omdat ik dat in een row in m'n database wil bijvoegen", denk dan ruimer :D Je werkt hier met objecten, geen id's.. id's zijn slechts sleutels om die objecten terug te vinden. En controleren of een id wel bestaat is dan overbodig, je probeert gewoon het user-object op te halen. Mislukt dat, nou, dan bestaat dat id blijkbaar niet.

Combineer je dat geven met positief programmeren (of naïef programmeren, of wat dan ook, iig programmeren alsof het gewoon goed gaat) dan wordt je code heel simpel, en hoef je niet specifiek je id te controleren. Exceptions zorgen er wel voor dat als het mis gaat niet finaal mis gaat.
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
<?php
try {
    $user_controller = new User_Controller($database);
    
    $message_controller = new Message_Controller($database);
    
    $sender = $user_controller->get($_SESSION['user_id']);
    
    $receiver = $user_controller->get($_POST['user_id']);
    
    // even om aan te geven wat User_Controller::get teruggeeft
    assert('$sender instanceof User');
    
    $message = $message_controller->new($sender, $receiver, $_POST['bericht']);
    
    if($message->is_valid($fouten)) // fouten is dan passed-by-reference
    {
        $message_controller->insert($message);
        
        show_success_message($message);
    }

    else
    {
        // een of andere code om je formulier weer tevoorschijn te
        // toveren, ingevuld op basis van $message, voorzien van
        // dikke rode teksten volgens de data in $fouten

        show_message_form($message, $fouten);
    }
}

?>


User_Controller::get gooit een exception zodra de row niet gevonden is.

edit: wat je ook zou kunnen doen als je meer email dan pm probeert na te bouwen (maar dit wordt wel ingewikkelder) is zo'n soort opzet, waarbij je een bericht naar meerdere personen kan sturen (de ontvanger is dan niet meer onderdeel van het bericht zelf):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$message
= $message_controller->new($sender, $_POST['message']);

foreach($_POST['receiver_ids'] as $receiver_id) {
    $receiver = $message_controller->get($receiver_id);
    
    $message_controller->sendTo($message, $receiver);
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Jelmer -
 
Yearupie Achternaamloos

Yearupie Achternaamloos

04/01/2010 16:36:00
Quote Anchor link
Zonder dat static zou ik het ook nog wel zelf kunnen maken, maar ik denk dat het met static niet echt mogelijk is om een database verbinding mee te geven in de class.

Het is de bedoeling om te kijken of de user met dat id bestaat, voor de rest hoef ik niks.

Dus mijn vraag: Is het mogelijk om $db in de User_Controller class te krijgen en dan nog steeds via de static manier op te vragen? Zoja, Hoe?
 
Joren de Wit

Joren de Wit

04/01/2010 16:42:00
Quote Anchor link
Yearupie schreef op 04.01.2010 16:36:
Dus mijn vraag: Is het mogelijk om $db in de User_Controller class te krijgen en dan nog steeds via de static manier op te vragen? Zoja, Hoe?
Dan zou je een instantie van de PDO class als parameter aan die static method mee moeten geven.

Maar ik ben het met Jelmer eens, de manier die hij schetst is een stuk logischer...
 



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.