[OOP] Classes vanuit andere classes
Ik ben sinds een tijdje bezig met object georiënteerd programmeren omdat het me wel aanspreekt. Ik leer op school Java en die manier van programmeren spreekt me ook wel aan.
Wat ik dus heb gedaan, ik heb een paar classes gemaakt in PHP die ongeveer op hetzelfde neerkomen als in Java.
Waar ik echter mee in de knoop raak is het volgende.
Ik heb deze classes:
Code (php)
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
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
<?php
// Standaard classes
class Form
{
private $aElements;
public function setElements()
{
$this->aElements = func_get_args();
}
public function build()
{
$sForm = '<form method="post" action=""><p>';
foreach ($this->aElements as $oElement)
{
$sForm .= $oElement->build();
}
return $sForm.'</p></form>';
}
public function addActionListener($oHandler)
{
}
}
class Input
{
private $bRequired;
public function setRequired($bRequired)
{
$this->bRequired = $bRequired ? true : false;
}
}
class Button extends Input
{
private $sName, $sValue, $iType;
public function __construct($sName, $sValue = '', $iType = 1)
{
$this->sName = $sName;
$this->sValue = $sValue;
$this->iType = $iType;
}
public function setValue($sValue)
{
$this->sValue = $sValue;
}
public function build()
{
return '<input type="'.(($this->iType == 1) ? 'submit' : 'reset').'" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
}
class Text extends Input
{
private $sName, $sValue;
public function __construct($sName, $sValue = '')
{
$this->sName = $sName;
$this->sValue = $sValue;
}
public function setValue($sValue)
{
$this->sValue = $sValue;
}
public function build()
{
return '<input type="text" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
}
// Classes per pagina
class KnopHandler
{
}
$oForm = new Form();
$oText = new Text('tekst');
$oButton = new Button('knop', 'Klik me');
$oForm->setElements($oText, $oButton);
echo $oForm->build();
?>
// Standaard classes
class Form
{
private $aElements;
public function setElements()
{
$this->aElements = func_get_args();
}
public function build()
{
$sForm = '<form method="post" action=""><p>';
foreach ($this->aElements as $oElement)
{
$sForm .= $oElement->build();
}
return $sForm.'</p></form>';
}
public function addActionListener($oHandler)
{
}
}
class Input
{
private $bRequired;
public function setRequired($bRequired)
{
$this->bRequired = $bRequired ? true : false;
}
}
class Button extends Input
{
private $sName, $sValue, $iType;
public function __construct($sName, $sValue = '', $iType = 1)
{
$this->sName = $sName;
$this->sValue = $sValue;
$this->iType = $iType;
}
public function setValue($sValue)
{
$this->sValue = $sValue;
}
public function build()
{
return '<input type="'.(($this->iType == 1) ? 'submit' : 'reset').'" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
}
class Text extends Input
{
private $sName, $sValue;
public function __construct($sName, $sValue = '')
{
$this->sName = $sName;
$this->sValue = $sValue;
}
public function setValue($sValue)
{
$this->sValue = $sValue;
}
public function build()
{
return '<input type="text" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
}
// Classes per pagina
class KnopHandler
{
}
$oForm = new Form();
$oText = new Text('tekst');
$oButton = new Button('knop', 'Klik me');
$oForm->setElements($oText, $oButton);
echo $oForm->build();
?>
Ik wil zoals in Java bijvoorbeeld ook een addActionListener() functie hebben. Dan zou ik in mijn voorbeeld $oButton->addActionListener(new KnopHandler()) gebruiken. Kan iemand me helpen hoe ik dit kan realiseren?
Verder vraag ik me ook af hoe ik een object kan benaderen vanuit een ander object. Bijvoorbeeld, ik heb het object $oButton. In de class daarvan (class Button) wil ik $oText benaderen. Is dat mogelijk?
Bij voorbaat dank!
Net als in java kan je classes extenden en classes includen in een andere pagina waardoor je deze weer aanroept.
Gewijzigd op 29/08/2011 16:31:09 door Roel -
Roel van de Water op 29/08/2011 16:26:21:
Dat snap ik. Maar als ik in m'n Button class $oText probeer aan te roepen krijg ik fouten.
omdat $oText niet bestaat.
Dat new KnopHandler() is trouwens geregeld.
Het tweede probleem lukt me nog steeds niet. Ik weet totaal niet wat ik moet doen. M'n script ziet er nu zo uit trouwens:
[script]
Code (php)
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
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
<?php
// Standaard classes
class Form
{
private $aElements;
public function setElements()
{
$this->aElements = func_get_args();
}
public function build()
{
$sForm = '<form method="post" action=""><p>';
foreach ($this->aElements as $oElement)
{
$sForm .= $oElement->build();
}
return $sForm.'</p></form>';
}
public function getValue($oElement)
{
return $_POST[$oElement];
}
}
class Input
{
private $bRequired;
public function setRequired($bRequired)
{
$this->bRequired = $bRequired ? true : false;
}
}
class Button
{
private $sName, $sValue, $iType;
public function __construct($sName, $sValue = '', $iType = 1)
{
$this->sName = $sName;
$this->sValue = $sValue;
$this->iType = $iType;
}
public function setValue($sValue)
{
$this->sValue = $sValue;
}
public function build()
{
return '<input type="'.(($this->iType == 1) ? 'submit' : 'reset').'" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
public function addActionListener($oHandler)
{
if (isset($_POST[$this->sName])) {
new $oHandler;
$oHandler->Main();
}
}
}
class Text extends Input
{
private $sName, $sValue;
public function __construct($sName, $sValue = '')
{
$this->sName = $sName;
$this->sValue = $sValue;
}
public function setValue($sValue)
{
$this->sValue = $sValue;
}
public function build()
{
return '<input type="text" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
public static function getValue()
{
return 'test';// $_POST[$this->sName];
}
}
// Classes per pagina
class KH extends Form
{
public function Main()
{
echo $this->getValue('tekst');
}
}
$oForm = new Form();
$oText = new Text('tekst');
$oButton = new Button('knop', 'Klik me');
$oButton->addActionListener(new KH());
$oForm->setElements($oText, $oButton);
echo $oForm->build();[/script]
// Standaard classes
class Form
{
private $aElements;
public function setElements()
{
$this->aElements = func_get_args();
}
public function build()
{
$sForm = '<form method="post" action=""><p>';
foreach ($this->aElements as $oElement)
{
$sForm .= $oElement->build();
}
return $sForm.'</p></form>';
}
public function getValue($oElement)
{
return $_POST[$oElement];
}
}
class Input
{
private $bRequired;
public function setRequired($bRequired)
{
$this->bRequired = $bRequired ? true : false;
}
}
class Button
{
private $sName, $sValue, $iType;
public function __construct($sName, $sValue = '', $iType = 1)
{
$this->sName = $sName;
$this->sValue = $sValue;
$this->iType = $iType;
}
public function setValue($sValue)
{
$this->sValue = $sValue;
}
public function build()
{
return '<input type="'.(($this->iType == 1) ? 'submit' : 'reset').'" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
public function addActionListener($oHandler)
{
if (isset($_POST[$this->sName])) {
new $oHandler;
$oHandler->Main();
}
}
}
class Text extends Input
{
private $sName, $sValue;
public function __construct($sName, $sValue = '')
{
$this->sName = $sName;
$this->sValue = $sValue;
}
public function setValue($sValue)
{
$this->sValue = $sValue;
}
public function build()
{
return '<input type="text" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
public static function getValue()
{
return 'test';// $_POST[$this->sName];
}
}
// Classes per pagina
class KH extends Form
{
public function Main()
{
echo $this->getValue('tekst');
}
}
$oForm = new Form();
$oText = new Text('tekst');
$oButton = new Button('knop', 'Klik me');
$oButton->addActionListener(new KH());
$oForm->setElements($oText, $oButton);
echo $oForm->build();[/script]
Wat is precies je tweede probleem?
Het ging volgens mij niet zoals ik het in de eerste instantie wou, hoewel me dit toch de beste oplossing leek...
Excuus :P
Sorry dat ik alsnog reageer, maar is het nu opgelost of niet?
Jep.
Code (php)
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
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
<?php
/* Standard classes */
// Form class
class Form
{
private $aElements;
// After all elements are created, add them to the form
public function setElements()
{
$this->aElements = func_get_args();
}
// Build the form
public function build()
{
$sForm = '<form method="post" action=""><p>';
foreach ($this->aElements as $oElement)
{
$sForm .= $oElement->build();
}
return $sForm.'</p></form>';
}
// Get the value of an object
public function getValue($oElement)
{
return $this->aElements[$oElement]->getValue();
}
// Set the value of an object
public function setValue($oElement, $sValue)
{
$this->aElements[$oElement]->setValue($sValue);
}
}
// Input class, used for form elements
class Input extends Form
{
// Get the name of a form element
public function getName()
{
return $this->sName;
}
}
class Button extends Input
{
private $sName, $sValue, $iType;
// Set the name, value and type for a button
public function __construct($sName, $sValue = '', $iType = 1)
{
$this->sName = $sName;
$this->sValue = $sValue;
$this->iType = $iType;
}
// Set the value of the button
public function setValue($sValue)
{
$this->sValue = $sValue;
}
// Return the HTML button
public function build()
{
return '<input type="'.(($this->iType == 1) ? 'submit' : 'reset').'" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
// Add an ActionListener which is called when the button is clicked
public function addActionListener($oHandler)
{
if (isset($_POST[$this->sName])) {
new $oHandler;
$oHandler->Main();
}
}
}
class Text extends Input
{
private $sName, $sValue;
// Set the name and value for the textfield
public function __construct($sName, $sValue = '')
{
$this->sName = $sName;
$this->sValue = $sValue;
}
// Set the value of the textfield
public function setValue($sValue)
{
$this->sValue = $sValue;
}
// Get the value of the textfield
public function getValue()
{
return $_POST[$this->sName];
}
// Return the HTML textfield
public function build()
{
return '<input type="text" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
}
/* Classes per page */
class KH extends Form
{
// Main() is called when the button is clicked
public function Main()
{
$this->setValue('text', 'Text in a textfield');
}
}
$oForm = new Form();
$oText = new Text('text');
$oButton = new Button('button', 'Click me');
$oForm->setElements($oText, $oButton);
$oButton->addActionListener(new KH());
echo $oForm->build();
?>
/* Standard classes */
// Form class
class Form
{
private $aElements;
// After all elements are created, add them to the form
public function setElements()
{
$this->aElements = func_get_args();
}
// Build the form
public function build()
{
$sForm = '<form method="post" action=""><p>';
foreach ($this->aElements as $oElement)
{
$sForm .= $oElement->build();
}
return $sForm.'</p></form>';
}
// Get the value of an object
public function getValue($oElement)
{
return $this->aElements[$oElement]->getValue();
}
// Set the value of an object
public function setValue($oElement, $sValue)
{
$this->aElements[$oElement]->setValue($sValue);
}
}
// Input class, used for form elements
class Input extends Form
{
// Get the name of a form element
public function getName()
{
return $this->sName;
}
}
class Button extends Input
{
private $sName, $sValue, $iType;
// Set the name, value and type for a button
public function __construct($sName, $sValue = '', $iType = 1)
{
$this->sName = $sName;
$this->sValue = $sValue;
$this->iType = $iType;
}
// Set the value of the button
public function setValue($sValue)
{
$this->sValue = $sValue;
}
// Return the HTML button
public function build()
{
return '<input type="'.(($this->iType == 1) ? 'submit' : 'reset').'" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
// Add an ActionListener which is called when the button is clicked
public function addActionListener($oHandler)
{
if (isset($_POST[$this->sName])) {
new $oHandler;
$oHandler->Main();
}
}
}
class Text extends Input
{
private $sName, $sValue;
// Set the name and value for the textfield
public function __construct($sName, $sValue = '')
{
$this->sName = $sName;
$this->sValue = $sValue;
}
// Set the value of the textfield
public function setValue($sValue)
{
$this->sValue = $sValue;
}
// Get the value of the textfield
public function getValue()
{
return $_POST[$this->sName];
}
// Return the HTML textfield
public function build()
{
return '<input type="text" name="'.$this->sName.'" value="'.$this->sValue.'" />';
}
}
/* Classes per page */
class KH extends Form
{
// Main() is called when the button is clicked
public function Main()
{
$this->setValue('text', 'Text in a textfield');
}
}
$oForm = new Form();
$oText = new Text('text');
$oButton = new Button('button', 'Click me');
$oForm->setElements($oText, $oButton);
$oButton->addActionListener(new KH());
echo $oForm->build();
?>
Wat ik probeer, is vanuit m'n KH() (knophandler) de value te veranderen van het tekstvak. Alleen krijg ik telkens een fatal error:
Fatal error: Call to a member function setValue() on a non-object in /usr/home/deb17902/domains/globallife.nl/public_html/form.class.php on line 35
Het script is hier te vinden: klik
Weet iemand wat te doen om het werkend te krijgen?
Thx!
Gewijzigd op 04/09/2011 17:24:48 door Roel -
De error zegt namelijk dat de var waarin je die method koppelt geen object is. Alsof je zoiets hebt gedaan bijv. :
Gewijzigd op 04/09/2011 17:52:59 door Wouter J
Maar hoe fix ik dit? Bij het argument van de functie setValue ervoor zorgen dat ie het argument als een object ziet?
Bump.
De knophandler hoort Form niet uit te breiden, maar een form als property te dragen, zodat je erin $this->_form->setValue() kan doen.
Toevoeging op 05/09/2011 20:43:14:
Verder is het gebruiken listeners door requests heen (dus bijv. luisteren naar het submitten van een form) in PHP een stuk lastiger dan in Java, omdat daar de objecten blijven bestaan en je ze in PHP steeds moet herbouwen. Het is lastiger, niet onmogelijk, hoewel ik het niet echt op deze manier ben tegengekomen.
Weet je ook hoe ik een form als property meegeef?
Ik zou namelijk totaal niet weten hoe ik dit moet doen.
Bump.
Je kan een propertie maken van User door deze mee te geven in een methode. Voorbeeld:
Code (php)
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
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
<?php
class User
{
private $name;
public function __construct( $name )
{
$this->name = (string) $name;
}
public function getName()
{
return $this->name;
}
}
class Post
{
protected $author;
// veel code voor de post
public function setAuthor( User $author )
{
$this->user = $author;
}
public function getAuthor()
{
return $this->user->getName();
}
}
// Maak een nieuw User object
$user = new User('Roel');
// Maak een nieuw Post object
$bericht = new Post();
// Set de author door de User object mee te geven
$bericht->setAuthor($user);
// ... heel veel code ...
echo $bericht->getAuthor();
?>
class User
{
private $name;
public function __construct( $name )
{
$this->name = (string) $name;
}
public function getName()
{
return $this->name;
}
}
class Post
{
protected $author;
// veel code voor de post
public function setAuthor( User $author )
{
$this->user = $author;
}
public function getAuthor()
{
return $this->user->getName();
}
}
// Maak een nieuw User object
$user = new User('Roel');
// Maak een nieuw Post object
$bericht = new Post();
// Set de author door de User object mee te geven
$bericht->setAuthor($user);
// ... heel veel code ...
echo $bericht->getAuthor();
?>
Hierbij heb ik User als een propertie meegegeven aan $bericht. Deze heb ik in de propertie $author gezet. Vervolgens kan ik dit gewoon gebruiken als een class en kan ik $this->autor->getName() doen als ik de naam van User wil weten.
Thx!
Is zoiets als dit niet logischer?
@Ozzie, ik ben niet heel goed in het OOP denken dus het kan totaal verkeerd zijn wat ik nu ga zeggen. Maar ik vind wat ik heb gedaan handiger. Stel dat je later ook nog een avatar wil van die author, of een stukje biografie van die author. Dan moet je al je code weer aanpassen. I.p.v. daarvan stop je gewoon de hele user object in de post, zo kunnen we via het post object zelf bepalen wat we willen en wat niet.
Hoe kijken andere leden hier tegenaan? Vooral de mensen die vaker met OOP werken?