Parent class in child constructor als argument overwrite

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Johan K

Johan K

18/01/2012 01:56:44
Quote Anchor link
Beste,

Misschien een wat vreemde vraag want m'n PHP is een beetje roestig.
Ik zit een point en location class te maken en dit wil ik zeer efficiënt doen omdat deze class vaak en veel gaat worden gebruikt.

De "z" coordinaat heb je niet altijd nodig, dus de volgende opsplitsing.

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
<?php
    class Point{
        protected $x = 0,
                  $y = 0;

        public    function GetX(){
                      return $this->$x;
                  }

                  
        public    function GetY(){
                      return $this->$y;
                  }
                  
                  
        public    function __construct( $x, $y ){
                      $this->$x = $x;
                      $this->$y = $y;
                  }
    }


    class Location extends Point{
        protected $z = 0;
                                  
        public    function GetZ(){
                      return $this->$z;
                  }
                  
                  
        public    function __construct( "<....>" ){
                      $this->$z = $z;
                  }
    }

?>


Wat is zou willen bereiken is om je location zo te schrijven

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
    $x
= 1;
    $y = 2;
    $z = 3;

    $p = new Point( $x, $y );
    $b = new Location( $x, $y, $z ); // standaard
    $c = new Location( $p, $z );     // optioneel
?>


Ik zou dus willen kijken of het object (argument 1 van de Location constructor) gemaakt is door de Point, en als mogelijk de originele waarde van "$p" vervangen door de Location object met toegang tot de "$z".

Nu ben ik dus aan het zoeken geweest, en dan krijg je dus te maken met refference "&" op de variable waar ik nog niet zoveel kaas van heb gegeten (in ieder geval niet in PHP, ben C++ gewend en daar heeft het toch echt een andere functie :o)

Kan iemand mij de duw in de goede richting geven?

Alvast bedankt,
 
PHP hulp

PHP hulp

27/12/2024 01:55:38
 
Pieter Jansen

Pieter Jansen

18/01/2012 02:12:28
Quote Anchor link
edit2: Ik sla de plank weer eens volledig mis. Ik snap wat je bedoelt maar het is niet mogelijk met PHP. Waar je wel naar zou kunnen kijken is __clone() maar om een parent object te vervangen is per definitie niet mogelijk, ook niet met & referenties. Pointers heb je namelijk niet in PHP en wat dat betreft heb je gelijk en wijkt PHP erg af van C++.


edit: zie dat je nog wat anders bedoelt, Je wil een object meegeven in je Location object en die waardes gebruiken voor je nieuwe Location object. Klopt dit? Je kunt niet constructors overloaden helaas, maar gelukkig kun je wel default waardes aangeven in de constructor, dus niet-verplichte waardes. Dat kun je eventueel oplossen door in de constructor te kijken naar het eerste argument, als dit een Point object is, kun je de X en Y gewoon overnemen uit dat object en de 2e variabele als Z gebruiken. Dat betekent echter wel dat de Z variabele ( je 3e parameter ) op je Location object dus een default heeft, hetgeen ervoor zorgt dat de logica in je Point object gelijk is aan de logica in je Location object. Zie 2e code:

De header van de constructor handelt alle argumenten af in die klasse. Als je in Location dus X, Y en Z coordinaten wil gebruiken kun je de constructor dus gewoon zo maken:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

public function __construct($x, $y, $z){}

?>


Om vervolgens je parent aan te spreken kun je net als in C++ gewoon parent gebruiken.

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

public function __construct($x, $y, $z){
    parent::__construct($x, $y);
    $this->z = $z;
}


public function __construct($x, $y, $z = false){
       if($x instanceof Point){
        $this->x = $x->getX();
        $this->y = $x->getY();
        $this->z = $y;
    }
else{
        parent::__construct($x, $y);
        $this->z = $z;
    }
}


?>
Gewijzigd op 18/01/2012 02:55:52 door Pieter Jansen
 
Johan K

Johan K

18/01/2012 03:11:01
Quote Anchor link
Hey Merijn,

De code ($x instanceof Point) is waar ik op zoek naar was, maar als ik deze code zo zie omdat overloaden niet werkt dan ga ik er eventjes een nachie over slapen ;)

Bedankt voor het antwoord
 
Erwin H

Erwin H

18/01/2012 09:05:55
Quote Anchor link
Ik vind het een rare gedachte gang als ik zo vrij mag zijn. Waarom? Omdat je nu een object van type Location gaat aanmaken, met als argument een object van type Point, terwijl Point ook al de ancestor is van type Location. Met andere woorden, Als je Point in Location giet met die constructor, krijg je in feite een dubbel object Point in Location.

Volgens mij is het of veel beter om gewoon altijd type Location te gebruiken waarbij je het met (x,y) kan aanmaken, of met (x,y,z). Of je kan een Location object aanmaken met de X en Y waardes van de al bestaande Point (dus $c = new Location( $p->getX(), $p->getY(), $z ); ) waarna je het Point object vernietigd, want die heb je niet meer nodig.

Als je bezorgd bent over het vele gebruik ervan, dan zou ik in elk geval niet dubbele objecten in het geheugen houden.
 
Kris Peeters

Kris Peeters

18/01/2012 10:42:55
Quote Anchor link
Wat overerven beteft ...
Ik kom ook vanuit een c (ook zonder ++) achtergrond.
Wat overerving in c++ betreft, moet je zien dat je een een extended class altijd een nieuwe constructor zet.

Een constructor is een plek waar je waarden een initiële waarde kan geven, waar je dingen kan activeren, ...

Van daaruit begrijp ik dat je in een extended class de constructor van de parent ook wil uitvoeren, in je nieuwe constructor.

In php is het allemaal minder strikt. Je kan bv. properties al een waarde geven buiten elke methode

class Point{
protected $x = 0; // dit moet je in c niet proberen


Maar ik vind de algemene redenering toch ook wat vreemd.
Binnenin Location is je $this een location object. Je moet binnenin Location niet denken in termen van "ik heb nog een soort sub-objectje van de class Point nodig".
 
Johan K

Johan K

18/01/2012 16:29:05
Quote Anchor link
In theorie zag het allemaal het wat beter uit dan in de praktijk, ik wilde dat ik me niet druk hoefte te maken over calculaties tussen deze punten zoals de lengte tussen point-point of point-loc, waarbij we toch eventjes over wat ingewikkeldere calculaties praten (ook voor de computer) terwijl ik deze niet altijd nodig heb waarbij de erving van bijvoorbeeld "getDistance" overschreven word om met xyz te werken.

Ik ben een spelletje aan het maken die in de ruimte afspeelt, hiermee werk ik met sterrenkaarten dus kortom rectangles, waarbij de sx,sy en ex,ey ook weer te maken heeft met Points.

Het idee hierachter, is dat ik codes uit kan voeren zoals het selecteren van planeten in rectangle of in range van point en of loc.

Kortom, idee klonk theoretisch goed maar in de praktijk moeilijker te implementeren.

Nogmaals bedankt heren.
 
Pieter Jansen

Pieter Jansen

18/01/2012 17:06:13
Quote Anchor link
Aha, maar heeft niet elk onderdeel dan XYZ coordinaten nodig? Een vector alleen is niet genoeg tenzij je enkel flat maps gebruikt. Anders kun je altijd nog een matrix gebruiken om je calculaties op los te laten, dan hoef je geen location objects te gebruiken maar gewoon array`s.
 



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.