[php5] attributen parent & child achterhalen

Pagina: 1
Acties:
  • 144 views sinds 30-01-2008
  • Reageer

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 00:27
Ik heb een abstracte class gemaakt en een aantal classes die deze abstracte class extenden. Binnen deze classes heb ik een een getter en setter methode (__get, __set) gemaakt die de verschillende attributen kunnen setten dan wel ophalen.

Wat ik nu wil is dat als je een attribuut wat niet binnen de class bestaat probeert te setten (of getten) dat er dan een exception wordt gegooid of dat alle foutmeldingen in ieder geval worden verwerkt (dus dat je die Notice-errors niet krijgt te zien) Ik werk namelijk met error_reporting op e_all en dan wil je die dingen ook graag netjes in je code hebben afgevangen :)

Met het gebruik van
PHP:
1
get_object_vars($this)

krijg je alleen de attributen van de child class terug :? (daar wordt deze funtie aangeroepen) maar niet de attributen van de parent class die wordt extend. Aangezien hier veel meer attributen instaan wil ik daar ook graag over kunnen beschikken.

Misschien een beetje onsamenhangend verhaal (:P) maar als het mogelijk is om alle aanwezige attributenop te vragen zou je hier een controle op kunnen loslaten en kun je bij evt niet bestaande attributen een exception gooien.

iemand hier misschien ook ervaring mee die het wil delen of interessante gedachten erover heeft?

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 07-05 20:00
Ik denk dat je in de richting van Reflection moet gaan zoeken. Ik heb er zelf nog niet mee gewerkt, dus of je ook je properties van je base classen kunt ophalen weet ik niet zeker (Ik denk van wel). Maar dat zul je dan even moeten uitzoeken.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Eenvoudiger: get_class_vars en get_parent_class

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05-2025

GX

Nee.

drm schreef op vrijdag 22 april 2005 @ 11:34:
Eenvoudiger: get_class_vars en get_parent_class
En dat dan recursief.
of get_class_vars($this->parent): (psuedo code)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

GX:
En dat dan recursief.
of get_class_vars($this->parent): (psuedo code)
Niet recursief, iteratief. En je pseudocode klopt ook niet.
PHP:
1
2
3
4
5
6
7
for (
   $className = get_class ( $this ), $attributes = array ();
   $className;
   $className = get_parent_class ( $className )
) {
   $attributes = array_merge ( $attributes, get_class_vars ( $className ) );
}

iets van die strekking

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 00:27
get_class_vars(parent) gaat in ieder geval niet helemaal goed kan ik je vertellen....

Wat wel gaat is:
PHP:
1
2
get_class_vars(get_class($this));
get_class_vars(get_parent_class($this));


dan heb je de attributen van de parent class en van de child in een tweetal mooie arrays :)

[edit]

PHP:
1
$attributes = array_merge(get_class_vars(get_class($this)), get_class_vars(get_parent_class($this)));

[ Voor 19% gewijzigd door TheRebell op 22-04-2005 12:19 ]


  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 00:27
Hmm, vanuit het oogpunt van een mooi model zou het betr zijn om deze manier in de parent clas te zetten ipv in elk child. Anders krijg je weer van die 'zooi' (lees: overbodige dingen die je weer overal in moet plaatsen) in al de childs (en dat zijn er iets van > 17 ofzo).

Als ik nu alleen deze manier toepas krijg je, logischerwijs, de attributen van de parent. Dit moet dus het child zijn, of in ieder geval de class die de parent heeft ge-extend.

Er wordt op php.net wel een voorbeeld gegeven ergens onderaan van iemand die ook zoiets wil doen. Het kan niet (zegt ie) alleen heeft hij een manier gevonden via
PHP:
1
debug_traceback();

alleen is dat nou niet echt een mooie manier...

[ Voor 27% gewijzigd door TheRebell op 22-04-2005 18:24 ]


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

Ik heb laatst ook zo'n class geschreven, de versie die online staat is nog niet helemaal af, maar dit werkt best wel perfect:

http://beta.zapguide.nl/dbobject.class.php.txt

Het mooie is dat ik voor m'n databasevelden altijd bijv strValueName/chrValueName/blbValueName etc gebruik, en die kan je gelijk afvangen in de class en daar automagisch je slashes enzow overheen pleuren :)

Ook wordt een databaserow automagisch geupdate als je een waarde in de class wijzigt. érrrug makkelijk :9

[ Voor 49% gewijzigd door SchizoDuckie op 22-04-2005 18:27 ]

Stop uploading passwords to Github!


  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 00:27
@SchizoDuckie:
ziet er leuk uit alleen heb jij al je properties uit je database. Ik heb dus m'n properties in de classes staan en dat maakt het iets lastiger om op te vragen (tenminste vanuit de parent->child). Doe je child->parent dan is het allemaal niet zo moeilijk

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

TheRebell schreef op vrijdag 22 april 2005 @ 18:30:
@SchizoDuckie:
ziet er leuk uit alleen heb jij al je properties uit je database. Ik heb dus m'n properties in de classes staan en dat maakt het iets lastiger om op te vragen (tenminste vanuit de parent->child). Doe je child->parent dan is het allemaal niet zo moeilijk
Ik denk dan dus dat je in je __get() even zo'n loopje met get_parent_vars moet draaien als die nog niet bekend zijn, en die in de variabele array gooien zoals ik doe met mn db values.

Stop uploading passwords to Github!


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

TheRebell:
Hmm, vanuit het oogpunt van een mooi model zou het betr zijn om deze manier in de parent clas te zetten ipv in elk child. Anders krijg je weer van die 'zooi' (lees: overbodige dingen die je weer overal in moet plaatsen) in al de childs (en dat zijn er iets van > 17 ofzo).
Dat hoeft helemaal niet.

PHP:
1
2
3
4
5
6
7
8
9
10
class A {
   function f () {
      echo get_class ( $this );
   }
}

class B extends A {}

$obj = new B ();
$obj->f (); // outputs: 'B'

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1