PHP OOP structuur

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Toby hinloopen

toby hinloopen

09/04/2009 16:50:00
Quote Anchor link
Ik vind javascript's OOP structuur erg goed, waarbij je classes in object object classes kan maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?

function a() {
  function
b() {
    //etc
  }
}

var
c = new a();
var
d = new c.b();
var
e = new c.b();

?>


Je kan dus meerdere objecten binnen een object maken. Hoe doe je dit met PHP? ik snap dat implement en extend verhaal niet echt.

Dus... hoe maak je in PHP een structuur waarbij je objecten in een object kan aanmaken?
Wie kan mijn bovenstaande voorbeeld eventjes omzetten in PHP?
Gewijzigd op 01/01/1970 01:00:00 door Toby hinloopen
 
PHP hulp

PHP hulp

25/05/2024 21:55:43
 
Nicoow Unknown

Nicoow Unknown

09/04/2009 16:57:00
Quote Anchor link
Hoe bedoel je precies?
Wil je bijvoorbeeld een binaire boom maken, of linked list,,
waarbij een object ergens een referentie heeft naar een ander object?

dus iets als dit (C#)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
public class node
{
     private int val;
     private node next;
    
     public node(int val, node next) {
          this.val = val;
          this.node = next;
     }
     public node(int val)
        : node(val, null)
     { }
}


of zit k er nu ver naast
 
Toby hinloopen

toby hinloopen

09/04/2009 17:01:00
Quote Anchor link
ik wil inderdaad een soort boom met verschillende objecten maken.

Stel, ik heb een object genaamt "flat". Ik wil meerdere flatgebouwen kunnen aanmaken en in ieder flatgebouw wil ik woningen kunnen aanmaken..., zoals in deze javascript code:
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
<?

function flat() {
  var
woningen = [];
  var
parent = this;

  this.woning = function() {
    parent.woningen.push(this);
  }
}

var
mooieflat = new flat();

var
eenwoning = new mooieflat.woning();
var
eenanderewoning = new mooieflat.woning();

?>


en nu wil ik weten hoe je dit in PHP maakt.
 
Nicoow Unknown

Nicoow Unknown

09/04/2009 17:15:00
Quote Anchor link
even uit de losse pols
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
<?php

/**
 * @author Nico Kaag
 * @copyright 2009
 */

error_reporting(E_ALL);

class flat
{
    public $woningen = array();
    public $naam;
    
    public function __construct(array $woningen, $naam)
    {

        $this->woningen = $woningen;
        $this->naam = $naam;
    }

    public function addWoning($naam)
    {

        $arrayCount = count($this->woningen);
        $this->woningen[$arrayCount] = $naam;
    }
}


$woningen1 = array("woning1", "woning2");
$woningen2 = array("woning1", "woning2", "woning3", "woning4");
$flat1 = new flat($woningen1, "Eersteflat");
$flat2 = new flat($woningen2, "Tweedeflat");
$flat1->addWoning("Woning3");
$flat2->addWoning("Woning5");

print_r($flat1->woningen);
echo '<br />';
print_r($flat2->woningen);
?>


Geen idee of t werkt :P

Dit is btw met een array, je kan ook een classe woningen maken,
en dan voeg je bijvoorbeeld 1 woning toe aan de flat, en dan voeg je de rest van de woningen toe aan de bovenliggende wonibg:
ziet er dan zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
Flat--
--|----Woning1
------------|_____Woning2
-----------------------|_________Woning 3
-----------------------------------------|_________null
Gewijzigd op 01/01/1970 01:00:00 door Nicoow Unknown
 
Toby hinloopen

toby hinloopen

09/04/2009 17:25:00
Quote Anchor link
Maar het is nog steeds niet hetzelfde als 2 losse classes aanmaken. Is PHP zo beperkt vergeleken Javascript?
Moet toch een logische manier voor te doen zijn...

Hoe werkt dat "extend" en "implement" dan?
Gewijzigd op 01/01/1970 01:00:00 door toby hinloopen
 
Nicoow Unknown

Nicoow Unknown

09/04/2009 17:28:00
Quote Anchor link
ik weet niet precies wat je wilt.
Jij wilt dat iedere woning een nieuw object is?
en dat iedere flat een nieuw object is?

en voor de rest is google toch echt een betere vriend as ik/mij
 
GaMer B

GaMer B

09/04/2009 17:28:00
Quote Anchor link
Tuurlijk kan je meerdere instances aanmaken van een class.
 
Toby hinloopen

toby hinloopen

09/04/2009 17:30:00
Quote Anchor link
nico schreef op 09.04.2009 17:28:
ik weet niet precies wat je wilt.
Jij wilt dat iedere woning een nieuw object is?
en dat iedere flat een nieuw object is?

en voor de rest is google toch echt een betere vriend as ik/mij

ja. Een woning moet een object zijn en iedere flat moet ook een object zijn. Logisch toch? een woning is toch een object? een flat is ook een object. Een woning is een onderdeel van een flat. Dat wil ik terugzien in PHP. In Javascript is dat prima te doen maar in PHP blijf ik er maar ruzie mee hebben.
 
Toby hinloopen

toby hinloopen

09/04/2009 17:32:00
Quote Anchor link
GaMer13 schreef op 09.04.2009 17:28:
Tuurlijk kan je meerdere instances aanmaken van een class.

dat wil ik ook.
Ik wil meerdere flats kunnen aanmaken en in deze flat wil ik meerdere woningen aanmaken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?

$flat1
= new flat();
$woning1 = new $flat1->woning();
$woning2 = new $flat1->woning();
$flat2 = new flat();
$woning3 = new $flat2->woning();
$woning4 = new $flat2->woning();

?>
 
Johan

johan

09/04/2009 17:39:00
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
<?php

class a{
    var
$b = "";
    
    function
__construct(){
        $this->b = new b();
    }
    function
printUitB(){
        $this->b->printHallo();
    }
}


class b{
    
    function
printHallo(){
        echo "Hallo </br>";
    }
}


$a = new a();
$a->printUitB();

?>
Gewijzigd op 01/01/1970 01:00:00 door johan
 
Toby hinloopen

toby hinloopen

09/04/2009 17:41:00
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
<?php

class a{
    var
$b = "";
    
    function
__construct(){
        $this->b = new b();
    }
    function
printUitB(){
        $this->b->printHallo();
    }
}


class b{
    
    function
printHallo(){
        echo "Hallo </br>";
    }
}


$a = new a();
$a->printUitB();

?>

Volgens mij is dit niet helemaal hetzelfde. Dit trucje ken ik al wel ja.
 
Willem Jan Z

Willem Jan Z

09/04/2009 17:42:00
Quote Anchor link
Een voorbeeld zoals jij het wil denk ik. flat en rijtjeshuis extenden woning. Ze hebben allebei kamers en een oppervlakte. Een flat heeft een verdieping, een rijtjeshuis heeft een nummer (hoeveelste huis vanaf links), even vreemd, maar je snapt het idee hierdoor wel. Elke extended class erft de eigenschappen en methods van de parent (woning).

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
    class woning {
        
        public $rooms;
        public $surface;
        
    }

    
    class flat extends woning {
        
        public $floor;
        
    }

    
    class rijtjeshuis extends woning {
        
        public $nr;

                public function isCornerHouse() {
                
                }
        
    }

?>
 
Toby hinloopen

toby hinloopen

09/04/2009 17:46:00
Quote Anchor link
WillemJan Z schreef op 09.04.2009 17:42:
Een voorbeeld zoals jij het wil denk ik. flat en rijtjeshuis extenden woning. Ze hebben allebei kamers en een oppervlakte. Een flat heeft een verdieping, een rijtjeshuis heeft een nummer (hoeveelste huis vanaf links), even vreemd, maar je snapt het idee hierdoor wel. Elke extended class erft de eigenschappen en methods van de parent (woning).

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
    class woning {
        
        public $rooms;
        public $surface;
        
    }

    
    class flat extends woning {
        
        public $floor;
        
    }

    
    class rijtjeshuis extends woning {
        
        public $nr;

                public function isCornerHouse() {
                
                }
        
    }

?>


Dus ik kan hiermee een flat maken en daarna woningen toevoegen? zo ja: hoe?
Ik snap niet helemaal hoe ik dit moet gebruiken...
Gewijzigd op 01/01/1970 01:00:00 door toby hinloopen
 
Willem Jan Z

Willem Jan Z

09/04/2009 17:56:00
Quote Anchor link
Nee, andersom juist in dit geval. Een flat is ook een woning.
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
<?php
    class woning {
        
        public $rooms;
        public $surface;        
    }

    
    class flat {
        
        private $woningen;
        
        public function addWoning(Woning $woning) {
            $this->woningen[] $woning;
        }

        
        public function getWoningen() {
            return $this->woningen;
        }
        
    }

?>

Nu heb je een flat waaraan je woningen kan toevoegen.
 
Toby hinloopen

toby hinloopen

09/04/2009 18:00:00
Quote Anchor link
WillemJan Z schreef op 09.04.2009 17:56:
Nee, andersom juist in dit geval. Een flat is ook een woning.
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
<?php
    class woning {
        
        public $rooms;
        public $surface;        
    }

    
    class flat {
        
        private $woningen;
        
        public function addWoning(Woning $woning) {
            $this->woningen[] $woning;
        }

        
        public function getWoningen() {
            return $this->woningen;
        }
        
    }

?>

Nu heb je een flat waaraan je woningen kan toevoegen.

Dus.... je moet dan eerst een flat aanmaken, dan een woning aanmaken en dan handmatig een woning toevoegen aan een flat.

Beetje vaag hoor...
 
Willem Jan Z

Willem Jan Z

09/04/2009 18:02:00
Quote Anchor link
Hoezo is dat vaag? Het zijn toch 2 verschillende soorten?

Tuurlijk, het kan ook zo:
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 woning {
        
        public $rooms;
        public $surface;        
    }

    
    class flat {
        
        private $woningen;
        
        public function addWoning() {
            $this->woningen[] = new Woning();
        }

        
        public function getWoningen() {
            return $this->woningen;
        }
        
    }


$flat = net flat();
$flat->addWoning();
echo $flat->wonigen[0]->rooms;
?>
 
Frank -

Frank -

09/04/2009 18:07:00
Quote Anchor link
Je zou in de constructor van de flat al het aantal woningen kunnen opgeven. Een flat zonder woningen is tenslotte geen flat. Zo zou je ook het aantal verdiepingen kunnen opgeven in de constructor, net wat jij leuk vindt.
 
Toby hinloopen

toby hinloopen

09/04/2009 18:07:00
Quote Anchor link
WillemJan Z schreef op 09.04.2009 18:02:
Hoezo is dat vaag? Het zijn toch 2 verschillende soorten?

Tuurlijk, het kan ook zo:
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 woning {
        
        public $rooms;
        public $surface;        
    }

    
    class flat {
        
        private $woningen;
        
        public function addWoning() {
            $this->woningen[] = new Woning();
        }

        
        public function getWoningen() {
            return $this->woningen;
        }
        
    }


$flat = net flat();
$flat->addWoning();
echo $flat->wonigen[0]->rooms;
?>


En wat nou als ik niet alleen flats heb...? Ik heb ook rijtjes huis. Bij beide objecten wil ik woningen kunnen toevoegen, maar het zijn wel verschillende soorten woningen.

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

$flat1
= new flat();
$woning1 = new $flat1->woning();

$flat2 = new flat();
$woning2 = new $flat2->woning();

$straat1 = new straat();
$woning3 = new $straat1->woning();

$woning4 = new $straat1->woning();

[
/code]Maar...! de straatwoning wijkt af van de flatwoning. De flatwoning heeft bijv. een verdieping variable maar de straatwoning heeft weer hele andere eigenschappen.

Het moeten dus 2 verschillende subclasses zijn,

Ik wil gewoon echt dat het een sub-classe is van flat/straat.
kan dat nou echt niet...?
dat zou lekker irritant zijn...
Gewijzigd op 01/01/1970 01:00:00 door toby hinloopen
 
Nicoow Unknown

Nicoow Unknown

09/04/2009 18:16:00
Quote Anchor link
abstract class?
daarin staat al het gemeenschapellijke, en eventuele unieke waardes, is dan weer in de classe rijtjeshuis en flat
 
Tim

Tim

09/04/2009 19:01:00
Quote Anchor link
Zoiets, aangezien een echte 'sub-class' naar mijn weten niet bestaat in PHP?

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

class VerzamelingWoningen {
    // Algemene 'VerzamelingWoningen' class
    
    protected $woningen;
    
    public function addWoning(Woning $woning) {
        $this->woningen[] = $woning;
    }

    
    public function getWoningen() {
        return $this->woningen;
    }
}


class Flat extends VerzamelingWoningen {
    // Speciefieke 'VerzamelingWoningen' class; Flat
    
    protected $verdiepingen;
    
    public function setVerdiepingen($verdiepingen) {
        $this->verdiepingen = $verdiepingen;
    }

    
    public function getVerdiepingen() {
        return $this->verdiepingen;
    }
}


class Straat extends VerzamelingWoningen {
    // Speciefieke 'VerzamelingWoningen' class; Straat
    
    protected $veelGroen;
    
    public function setVeelGroen($veelGroen) {
        $this->veelGroen = $veelGroen;
    }

    
    public function getVeelGroen() {
        return $this->veelGroen;
    }
}


class Woning {
    // Algemene 'Woning' class
    
    protected $oppervlakte, $kamers;
    
    public function setOppervlakte($oppervlakte) {
        $this->oppervlakte = $oppervlakte;
    }

    
    public function getOppervlakte() {
        return $this->oppervlakte;
    }

    
    public function setKamers($kamers) {
        $this->kamers = $kamers;
    }

    
    public function getKamers() {
        return $this->kamers;
    }
}


class Flatje extends Woning {
    // Specifieke 'Woning' class; Flatje
    
    protected $verdieping;
    
    public function setVerdieping($verdieping) {
        $this->verdieping = $verdieping;
    }

    
    public function getVerdieping() {
        return $this->verdieping;
    }
}


class AleenstaandeWoning extends Woning {
    // Specifieke 'Woning' class; Alleenstaande woning
    
    protected $tuinOppervlakte;
    
    public function setTuinOppervlakte($tuinOppervlakte) {
        $this->tuinOppervlakte = $tuinOppervlakte;
    }

    
    public function getTuinOppervlakte() {
        return $this->tuinOppervlakte;
    }
}


$flat1 = new Flat;
$flat1->setVerdiepingen(3);

$flatje1 = new Flatje;
$flatje1->setVerdieping(1);
$flat1->addWoning($flatje1);

$flatje2 = new Flatje;
$flatje2->setVerdieping(3);
$flat1->addWoning($flatje2);

$straat1 = new Straat;
$straat1->setVeelGroen(1);

$alleen1 = new AlleenstaandeWoning;
$alleen1->setTuinOppervlakte(50);
$straat1->addWoning($alleen1);

echo var_dump($flat1->getWoningen());
echo var_dump($straat1->getWoningen());
[
/code]
Gewijzigd op 01/01/1970 01:00:00 door Tim
 
Toby hinloopen

toby hinloopen

09/04/2009 19:06:00
Quote Anchor link
Quote:
Zoiets, aangezien een echte 'sub-class' naar mijn weten niet bestaat in PHP?

belachelijk......
big - voor PHP.

@Tim: bedankt voor je mooie lap code.
Zal em eens 100x doorlezen.
 

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.