[OOP] Classes vanuit andere classes

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Roel -

Roel -

29/08/2011 16:13:43
Quote Anchor link
Hoi,

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)
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
<?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();

?>


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!
 
PHP hulp

PHP hulp

16/01/2022 11:32:51
 
Nick Audenaerde

Nick Audenaerde

29/08/2011 16:24:23
Quote Anchor link
Net als in java kan je classes extenden en classes includen in een andere pagina waardoor je deze weer aanroept.
 
Roel -

Roel -

29/08/2011 16:26:21
Quote Anchor link
Dat snap ik. Maar als ik in m'n Button class $oText probeer aan te roepen krijg ik fouten.
Gewijzigd op 29/08/2011 16:31:09 door Roel -
 
Fabian M

Fabian M

29/08/2011 17:44:03
Quote Anchor link
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.
 
Roel -

Roel -

29/08/2011 17:48:33
Quote Anchor link
Ik heb het nu met extended gedaan inderdaad. Ik wist niet dat dat bedoeld werd.
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)
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
<?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]
 
Niels K

Niels K

29/08/2011 19:56:28
Quote Anchor link
Wat is precies je tweede probleem?
 
Roel -

Roel -

29/08/2011 21:42:47
Quote Anchor link
Dat vraag ik mezelf ook af na die post eerlijk gezegd.
Het ging volgens mij niet zoals ik het in de eerste instantie wou, hoewel me dit toch de beste oplossing leek...

Excuus :P
 
Write Down

Write Down

29/08/2011 23:51:58
Quote Anchor link
Sorry dat ik alsnog reageer, maar is het nu opgelost of niet?
 
Roel -

Roel -

30/08/2011 12:40:06
Quote Anchor link
Jep.
 
Roel -

Roel -

04/09/2011 17:23:59
Quote Anchor link
Ik raak er toch nog niet helemaal aan uit.
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
<?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();
?>


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 -
 
Wouter J

Wouter J

04/09/2011 17:52:32
Quote Anchor link
Wat is de code waar je de method setValue aanroept?

De error zegt namelijk dat de var waarin je die method koppelt geen object is. Alsof je zoiets hebt gedaan bijv. :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$user
= 'Roel';
$user->setValue(); // Ahh, $user is een string geen object!
?>
Gewijzigd op 04/09/2011 17:52:59 door Wouter J
 
Roel -

Roel -

04/09/2011 17:55:32
Quote Anchor link
Dat is op regel 119. Ik snap inderdaad dat het daarom gaat.
Maar hoe fix ik dit? Bij het argument van de functie setValue ervoor zorgen dat ie het argument als een object ziet?
 
Roel -

Roel -

05/09/2011 19:20:20
Quote Anchor link
Bump.
 
Pim -

Pim -

05/09/2011 20:41:03
Quote Anchor link
Je doet het verkeerd.
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.
 
Roel -

Roel -

05/09/2011 21:12:44
Quote Anchor link
Ja het is ook een uitdaging om dit zo te maken.
Weet je ook hoe ik een form als property meegeef?

Ik zou namelijk totaal niet weten hoe ik dit moet doen.
 
Roel -

Roel -

06/09/2011 21:15:30
Quote Anchor link
Bump.
 
Wouter J

Wouter J

06/09/2011 21:48:07
Quote Anchor link
Waarom bump je elke dag? We zijn hier gewoon vrijwillig en als de persoon die hier van af weet even niet online is is dit niet erg.

Je kan een propertie maken van User door deze mee te geven in een methode. Voorbeeld:
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
<?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();
?>

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.
 
Roel -

Roel -

06/09/2011 23:41:18
Quote Anchor link
Kijk, daar heb ik wat aan.
Thx!
 
Ozzie PHP

Ozzie PHP

06/09/2011 23:49:55
Quote Anchor link
@Wouter: is dat eigenlijk de "normale" manier om een compleet User object mee te geven aan de setAuthor() functie? Je hebt toch alleen maar een naam nodig?

Is zoiets als dit niet logischer?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$user = new User('Roel');
$author = $user->getName();
$post = new Post($author);
echo $post->getAuthor();  
 
Wouter J

Wouter J

07/09/2011 07:59:27
Quote Anchor link
@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.
 
Ozzie PHP

Ozzie PHP

07/09/2011 12:36:51
Quote Anchor link
@Wouter, ik weet ook niet wat in dit geval "goed" is.

Hoe kijken andere leden hier tegenaan? Vooral de mensen die vaker met OOP werken?
 

Pagina: 1 2 volgende »



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.