[OOP] Eerste script

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Michael -

Michael -

22/10/2013 13:59:30
Quote Anchor link
@Erwin, Ik probeer verder te programmeren op jou script en deze wil ik uitbreiden met label en button.
Nou heb ik jou laatste voorbeeld proberen te evenaren (maar dan zonder interface implementatie). Tot zover wordt de button meegenomen, maar hoe geef ik de child nou mee, dat begrijp ik niet uit jou 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
39
40
41
42
<?php
class Button{
    private $attributes;
    private $children;
    private $allowedTypes = Array('button','reset','submit');

    public function __construct($type,$name = null){
        $this->attributes = new Attributes;
        $this->attributes->setAttribute('type',$type);
        $this->attributes->setAttribute('name',$name);

        $this->type = $type; //?????
    }
    
    public function addChild( $child ){
        $this->children[] = $child;
    }

    
    public function writeTag(){
        if(in_array(strtolower($this->type),$this->allowedTypes))
        {

            $str = '<button'. $this->attributes->writeAttributes() .'>';
            foreach($this->children AS $child)
            {

                $str .= $child;
            }

            $str .= '</button><br />'.PHP_EOL;
            
            return $str;
        }

        else
        {
            throw new Exception('Button Type not allowed');
        }
    }
}


$form = new Form();
$form->addChild( new Input( 'text' , 'name' , 'name' ) );
$form->addChild( new Button( 'submit', 'save' ) );
echo $form->writeTag();
?>


Output
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
Warning: Invalid argument supplied for foreach() in ** on line 130
<form method="post" name="formulier1" action="/oo2.php">
<input type="text" id="name" name="name" /><br />
<input type="email" id="email" name="email" /><br />
<input type="tel" id="phone" name="phone" /><br />
<input type="date" id="birthdate" name="birthdate" /><br />
<input type="password" id="password" name="password" /><br />
<input type="number" id="aantal" name="aantal" /><br />
<button type="submit" name="save"></button><br />
</form>

De warning komt omdat de child voor de button niet wordt weergegeven

Edit:

En op regel 12 zie je dat ik $type nogmaals opsla om deze op regel 20 te gebruiken, maar dit lijkt me onlogisch omdat het eigenlijk al als attribute wordt opgeslagen, maar kan ik deze ook uitlezen?
Gewijzigd op 22/10/2013 14:07:40 door Michael -
 
PHP hulp

PHP hulp

25/04/2024 04:10:02
 
Erwin H

Erwin H

22/10/2013 14:06:53
Quote Anchor link
Dat was een foutje van mij. De $children property moet je als array definieren, zodat je nooit een probleem krijgt in je foreach. Anders, als je geen kinderen meegeeft krijg je die foutmelding omdat $children null is en geen array.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
private $children = array();
?>

Inmiddels ook aangepast in mijn vorige post.
 
Michael -

Michael -

22/10/2013 14:09:40
Quote Anchor link
Erwin H op 22/10/2013 14:06:53:
Dat was een foutje van mij. De $children property moet je als array definieren, zodat je nooit een probleem krijgt in je foreach. Anders, als je geen kinderen meegeeft krijg je die foutmelding omdat $children null is en geen array.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
private $children = array();
?>

Inmiddels ook aangepast in mijn vorige post.

Oops dat was van ons beide niet zo slim. Uiteraard moet dat een Array zijn :-)
De warning blijft daarmee weg, maar ik heb nog geen 'value' voor de button
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<button type="submit" name="save"></button><br />
 
Erwin H

Erwin H

22/10/2013 14:46:59
Quote Anchor link
In dit geval kan je voor twee mogelijkheden kiezen om die value mee te geven. Ofwel je maakt een soort 'text only' class (die dus geen html tags bouwt, maar alleen maar platte tekst), ofwel je geeft de value ook als parameter mee aan de constructor (of via een andere setter). In de writeTag() method plaats je value dan gewoon tussen de tags in de string die je teruggeeft.
 
Dennis WhoCares

Dennis WhoCares

22/10/2013 20:54:56
Quote Anchor link
Sorry dat ik deze topic kaap, maar omdat ik toch ook mijn eigen idee over classes en functies heb wil ik graag weten wat jullie van mijn formcontroller vinden
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
<?php
class Form {
    public $form = array();
    private $_method;
    private $_methodes = array('POST','GET');
    private $_action;
    private $_enctype;
    private $_enctypes = array('application/x-www-form-urlencoded','multipart/form-data','text/plain','upload');
    private $_error = array();
    
    public function __construct($action,$method='POST',$enctype='application/x-www-form-urlencoded'){
        $this->_action = $action;
        $this->_method = strtoupper($method);
        $this->_enctype = strtolower($enctype);
        if(strtolower($this->_enctype) == 'upload') {
            $this->_enctype = 'multipart/form-data';
        }


        
        if(!in_array($this->_method,$this->_methodes)) {
            $this->_error[] = 'Deze methode is niet toegestaan! Toegestane methodes: ' . implode(', ',$this->_methodes);
        }

        if(!in_array($enctype,$this->_enctypes)) {
            $this->_error[] = 'Deze enctype is niet toegestaan! Toegestane enctypes: ' . implode(', ',$this->_enctypes);
        }

        if(empty($this->_error)) {
            $this->form[]='<form method="' . $this->_method . '" action="' . $this->_action . '" ecntype="' . $this->_enctype . '">';
        }
else {
            throw new Exception('De form kon niet gegenereerd worden! | ' . implode(' | ',$this->_error));
        }
    }

    
    public function append($input) {
        $this->form[]= $input->input;
    }
}



class Input {
    private $_type;
    private $_types = array('hidden','text','password','radio','checkbox','select','file','textarea','button','submit','reset');
    public $input;
    
    public function __construct($type, $name,$value='',$description='',$newLine=false) {
        $differs = array('textarea','select');
        if(in_array(strtolower($type),$this->_types)) {
            if($description<>'') {
                $this->input = '<label for="' . $name . '">' . $description . '</label>';
            }

            $this->_type = strtolower($type);
            if($this->_type == 'textarea') {
                $this->input .= '<textarea name="' . $name . '" id="' . $name . '">' . $value . '</textarea>';
            }
elseif($this->_type == 'select') {
                if(is_array($value)) {
                    $this->input .= '<select name="' . $name . '" id="' . $name . '">';
                    foreach($value as $value => $description) {
                        $this->input .= '<option value="' . $value . '" id="' . $name . '">' . $description . '</option>';
                    }

                    $this->input .= '</select>';
                }
else {
                        throw new Exception('De select input heeft meerdere keuze opties! Defineer deze als array("Waarde"=>"Omschrijving")');
                }
            }
else {
                $this->input .= '<input type="' . $type . '" name="' . $name . '" id="' . $name . '"value="' . $value . '">';
            }

            if($newLine) {
                $this->input .= '<br>';
            }
        }
else {
            throw new Exception('Deze type input is niet toegestaan! Toegestane types zijn: ' . implode(' ,',$this->_types));
        }
    }
}

?>
Gewijzigd op 22/10/2013 22:08:39 door Dennis WhoCares
 
Erwin H

Erwin H

23/10/2013 10:22:38
Quote Anchor link
Als ik public properties zie dan haak ik al af. Dat is wat mij betreft de grootste no-no in een OOP omgeving.
Als je echt een applicatie in OOP wilt ontwikkelen dan is 1 van de kenmerken dat elke class verantwoordelijk is voor zijn eigen doen en laten. De class moet ervoor zorgen dat input gechecked wordt en dat output altijd correct is en bruikbaar is, of als de class niet in staat is om daarvoor te zorgen dat er een foutmelding wordt opgeworpen zodat een andere class het kan overnemen. Met publieke properties is zowel input als output checken onmogelijk geworden.
Wat als ik bij jouw form class dit doe:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$form
= new Form( '' );
$form->form = 'gekaapt!';
?>

Kan jouw class me dan nog garanderen dat ik een mooi form op mijn scherm krijg?

Daarnaast mis je in je form ook de afsluitende form tag, dus je class kan alleen maar garanderen dat er nooit een correct form op het scherm komt.

Kijk verder ook naar mijn opmerkingen over de attributes op de vorige pagina. Ook jij doet dit weer in beide classes. Dubbel werk dus en volkomen inflexibel.
Gewijzigd op 23/10/2013 10:24:23 door Erwin H
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/10/2013 11:47:24
Quote Anchor link
Ik kom nog even terug op de interface die Michael nu nog weglaat en omdat die in juist bovengenoemde situatie zo handig is.

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
<?php

interface iFormField
{
    public function render();
}


class Button implements iFormField
{
    public function render()
    {

        // return $html;
    }
}


class Textfield implements iFormField
{
    public function render()
    {

        // return $html;
    }
}


?>


Wat ik probeer duidelijk te maken is dat door de interface iedere afgeleide class ook een functie render() MOET hebben.
Stel dat je na een half jaar opeens nog een nieuwe 'FormField' wilt toevoegen aan het rijtje. één blik op de interface en je weet het. De class die je gaat maken MOET een render() functie hebben. Je hoeft niet meer je code door te spitten of erger nog gaan debuggen omdat je dan iets over het hoofd ziet.

een interface is dus super handig als er meerder classen van afgeleid worden en daarom ook een must.
Gewijzigd op 23/10/2013 11:47:51 door Frank Nietbelangrijk
 
Donny Wie weet

Donny Wie weet

23/10/2013 14:44:41
Quote Anchor link
Frank: wat is class Textfield ->>>>>implements<<<<<-----
 
Erwin H

Erwin H

23/10/2013 15:13:40
Quote Anchor link
Dat is het keyword dat aangeeft dat de betreffende class de interface implementeert. Net als het keyword 'extends' aangeeft dat de class een overerving is van de andere class:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
class New_Class extends Old_Class implements Some_Interface{

}

?>

De class New_Class is dus een overerving van Old_Class en implementeert de interface Some_Interface.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

23/10/2013 15:14:05
Quote Anchor link
Donny:

Voor een class gebruik je extends ...
Voor een interface gebruik je implements ...

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
<?php

// interface
interface iFormField
{
}


// baseclass
class FormField implements iFormField
{
}


// afgeleide class
class Textfield extends FormField
{
}


?>
 
Dennis WhoCares

Dennis WhoCares

23/10/2013 19:31:02
Quote Anchor link
@Erwin, ik snap je redenen en ik weet dat public ook direct aanpasbaar is.
Ik was van plan om __toString() toe te passen, zoals ik nu heb, maar ik wou gewoon even weten wat voor commentaar erop komt:
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
<?php
error_reporting(E_ALL);
class Form {
    private $_form = array();
    private $_method;
    private $_methodes = array('POST','GET');
    private $_action;
    private $_enctype;
    private $_enctypes = array('application/x-www-form-urlencoded','multipart/form-data','text/plain','upload');
    private $_error = array();
    
    public function __construct($action,$method='POST',$enctype='application/x-www-form-urlencoded'){
        $this->_action = $action;
        $this->_method = strtoupper($method);
        $this->_enctype = strtolower($enctype);
        if(strtolower($this->_method) == 'upload') {
            $this->_method = 'multipart/form-data';
        }


        
        if(!in_array($this->_method,$this->_methodes)) {
            $this->_error[] = 'Deze methode is niet toegestaan! Toegestane methodes: ' . implode(', ',$this->_methodes);
        }

        if(!in_array($enctype,$this->_enctypes)) {
            $this->_error[] = 'Deze enctype is niet toegestaan! Toegestane enctypes: ' . implode(', ',$this->_enctypes);
        }

        if(empty($this->_error)) {
            $this->_form[]='<form method="' . $this->_method . '" action="' . $this->_action . '" ecntype="' . $this->_enctype . '">';
        }
else {
            throw new Exception('De form kon niet gegenereerd worden! | ' . implode(' | ',$this->_error));
        }
    }

    
    public function append($input) {
        $this->_form[]= $input;
    }

    
    public function __toString() {
        return implode("\n\r",$this->_form) . '</form>';
    }
}



class Input {
    private $_type;
    private $_types = array('hidden','text','password','radio','checkbox','select','file','textarea','button','submit','reset');
    private $_input;
    
    public function __construct($type, $name,$value='',$description='',$newLine=false) {
        $differs = array('textarea','select');
        if(in_array(strtolower($type),$this->_types)) {
            if($description<>'') {
                $this->_input = '<label for="' . $name . '">' . $description . '</label>';
            }

            $this->_type = strtolower($type);
            if($this->_type == 'textarea') {
                $this->_input .= '<textarea name="' . $name . '" id="' . $name . '">' . $value . '</textarea>';
            }
elseif($this->_type == 'select') {
                if(is_array($value)) {
                    $this->_input .= '<select name="' . $name . '" id="' . $name . '">';
                    foreach($value as $value => $description) {
                        $this->_input .= '<option value="' . $value . '" id="' . $name . '">' . $description . '</option>';
                    }

                    $this->_input .= '</select>';
                }
else {
                        throw new Exception('De select input heeft meerdere keuze opties! Defineer deze als array("Waarde"=>"Omschrijving")');
                }
            }
else {
                $this->_input .= '<input type="' . $type . '" name="' . $name . '" id="' . $name . '"value="' . $value . '">';
            }

            if($newLine) {
                $this->_input .= '<br>';
            }
        }
else {
            throw new Exception('Deze type input is niet toegestaan!');
        }
    }

    public function __toString() {
        return $this->_input;
    }
}


$myForm = new Form('login.php');
$myForm->append(new Input('text','login_user','Gebruikersnaam','Uw gebruikersnaam:',true));
$myForm->append(new Input('password','login_pass','password','Uw wachtwoord:',true));
$myForm->append(new Input('submit','login_btn','Login!'));
echo $myForm;


?>


En over die attributen heb je ergens wel gelijk, en eigenlijk wil ik deze dus zelf als 'geavanceerde' optie toevoegen bij de new Input()
Gewijzigd op 23/10/2013 19:43:48 door Dennis WhoCares
 

Pagina: « vorige 1 2



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.