[PHP] class extend maar hoofdclass aanroepen

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
Hoi,

Normaal zou je het volgende doen:

PHP:
1
2
3
4
5
6
7
8
9
class mainclass {
 ...
}

class subclass extends mainclass {
 ...
}

$foo = new subclass();


Je roept dan normaal de subclass aan zodat je de functies iot de mainclass en de subclass tot je beschikking hebt. Echter wat ik zou willen is een subclass1 en een subclass2 toevoegen aan de mainclass en dan eigenlijk via de mainclass aanroepen, waarmee ik ook toegang zou hebben tot subclass1 en subclass2. Misschien moet ik hier dan geen extends voor gebruiken maar iets anders, of misschien kan dit wel helemaal niet ....
Iemand die me verder op weg kan helpen?

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd

Waarom zou je subclasses willen aanroepen via de base class???
Wanneer je properties/methods van die subclasses benadert, en je subclass heeft daar geen override versie van, dan spreekt 'ie gewoon de versie van de base class aan (of van de base class van de base class, etc.).

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
het leek me vooral praktisch omdat er meedere subclasses kunnen zijn die de mainclass extenden.
Anders moet je voor iedere subclass een aparte variabele gebruiken.
(omdat de functies van de subclasses niet via de mainclass te benaderen zijn?)

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd

Je wil iets doen in de richting van ?

mainclass -> function();

mainclass -> subclass1 -> function();

mainclass -> subclass2 -> function();

Maar als je dan vanuit de subclasses members van de mainclass wil aanspreken dan moet je lelijk met pointers & refs gaan werken ed.

Verwijderd

Verwijderd schreef op donderdag 16 augustus 2007 @ 01:34:
Maar als je dan vanuit de subclasses members van de mainclass wil aanspreken dan moet je lelijk met pointers & refs gaan werken ed.
Pardon my french: maar wat de neuk is er lelijk aan fundamentele OO principes???

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

Als je die functies wilt hebben, maak je toch van subclass1 de main class, en wordt mainclass subclass2. Dus zo:
PHP:
1
2
3
4
5
6
7
8
9
<?php
class mainclass { // eerder subclass2
}

class subclass1 extends mainclass { // same
}

class subclass2 extends subclass1 { // subclass2 was eerder mainclass
}

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:51

Creepy

Tactical Espionage Splatterer

kokx: dit is nogal een triviaal voorbeeld maar het is vaak niet mogelijk om van een subclass zomaar een baseclass te maken (en vaak ook helemaal niet logisch).

Ik denk overigens dat de TS helemaal geen overerving wil gebruiken maar compositie. Kan je in je main class niet een array o.i.d. van objecten bijhouden die aangesproken moeten worden?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Verwijderd schreef op donderdag 16 augustus 2007 @ 09:02:
[...]
Pardon my french: maar wat de neuk is er lelijk aan fundamentele OO principes???
Helemaal niets mis met pointers en references hoor. Mocht ik vanavond wat meer tijd hebben dan zal ik een voorbeeldje posten met wat ik precies bedoel.

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
Creepy schreef op donderdag 16 augustus 2007 @ 09:19:
Ik denk overigens dat de TS helemaal geen overerving wil gebruiken maar compositie. Kan je in je main class niet een array o.i.d. van objecten bijhouden die aangesproken moeten worden?
Het gaat inderdaad om compositie. In zou in mijn mainclass (baseclass) wel een array kunnen bijhouden, maar als ik de mainclass initieer kan ik niet naar de subclasses toe (ook al extenden die de mainclass). Anders zou ik via een functie in de mainclass uit moeten zoeken naar welke subclass er gegaan zou moeten worden er daar in verder gaan, maar dat lijkt me ook niet dé oplossing.

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd


Verwijderd

Nee daar heb je vrijwel niets aan. Dat is namelijk wel een heel slecht voorbeeld van compositie (ik snap ook echt niet hoe dat artikel aan zo'n onterecht hoge rating komt). Sterker nog het is een heel slecht voorbeeld van OO in het algemeen.

Compositie is namelijk vrij simpel uit te leggen: Als de relatie tussen twee objecten een "bestaat uit" relatie is dan hebben we het over compositie. Overerving is een specialisatie relatie, dus een "is een" relatie.
Overerving: Een BMW is een Auto.
Composite: Een Auto bestaat uit onderdeel x (bijvoorbeeld een stoel).

Verwijderd

@mark platvoet, het kan aan mij liggen, maar hier staat het op dezelfde manier uitgelegd:
http://nl3.php.net/objaggregation

en uit je post kan ik niet helemaal opmaken waarom het artikel niet goed is?

Verwijderd

Verwijderd schreef op donderdag 16 augustus 2007 @ 10:35:
uit je post kan ik niet helemaal opmaken waarom het artikel niet goed is?
1. Omdat via een ongelooflijke omweg met slechte voorbeelden een poging wordt gedaan om uit te leggen wat compositie is. Twee pagina's geneuzel is echt teveel.

2. Een Page class die pas goed werkt na het aanroepen van een stuk of 4 constructor achtige functies (makeHeader etc). Ik zou enkel een functie 'get_contents_as_html' willen zien buiten de contructor om.

3. Het voorbeeld gaat spelen met de attributen van de Page class en veranderd daarmee de werking van de class. Dat is absoluut niet de bedoeling! De Table class zou de Page class enkel mogen gebruiken (dus functies aanroepen) omdat deze er uit bestaat.

Verwijderd

Ok daar heb je een punt ;) Maar ik denk dat het voor ts in iig wel duidelijk is hoe hij het nu moet doen (maar hij moet idd niet teveel op de implementatie van de voorbeelden letten) ;)

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
Het idee van de compositie is duidelijk ja.
Blijft nog een vraag over: Is het mogelijk om via de mainclass een functie uit de subclass aan te roepen zonder tussenkomst van een mainclass functie?

Dus: $mainclass->subclassmethod();

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd

SWINX schreef op donderdag 16 augustus 2007 @ 11:26:
Het idee van de compositie is duidelijk ja.
Blijft nog een vraag over: Is het mogelijk om via de mainclass een functie uit de subclass aan te roepen zonder tussenkomst van een mainclass functie?

Dus: $mainclass->subclassmethod();
Als er geen tussenkomst is van een mainclass-functie hoe moet je class dan weten waar subclassmethod() is?

Verwijderd

SWINX schreef op donderdag 16 augustus 2007 @ 11:26:
Het idee van de compositie is duidelijk ja.
Blijft nog een vraag over: Is het mogelijk om via de mainclass een functie uit de subclass aan te roepen zonder tussenkomst van een mainclass functie?
Ja en nee: Door overriding of het gebruik van een abstract functie in je base class. Of php uberhaupt abstracte functies ondersteund weet ik eigenlijk niet. Het komt er dus inh ieder geval op neer dat de functie wel benoemt is in je base class.

  • kokx
  • Registratie: Augustus 2006
  • Laatst online: 13-09 20:30

kokx

WIN

Nee, dit is niet mogelijk. Al zou je in PHP5 wel wat kunnen doen met de magic __call functie. Dan kun je gewoon $mainclass->subclassmethod(); doen. Dan wordt de __call functie aangeroepen die eventueel zou kunnen kijken of die in 1 van de subclasses voorkomt.

Verwijderd

Verwijderd schreef op donderdag 16 augustus 2007 @ 11:34:
[...]
Ja en nee: Door overriding of het gebruik van een abstract functie in je base class. Of php uberhaupt abstracte functies ondersteund weet ik eigenlijk niet. Het komt er dus inh ieder geval op neer dat de functie wel benoemt is in je base class.
php ondersteunt idd abstract classes (PHP5), maar dan heb je dus alsnog de tussenkomst van je mainclass

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
Verwijderd schreef op donderdag 16 augustus 2007 @ 11:33:
Als er geen tussenkomst is van een mainclass-functie hoe moet je class dan weten waar subclassmethod() is?
Ik bedoel daarmee zonder voor iedere functie binnen de mainclass wat te hoeven aanmaken, dus dat PHP "zelf weet" dat die functie uit de subclass komt (via de extend oid), maar ik hoorde al iemand over __call praten, laat ik eens kijken wat daarmee kan.
Verwijderd schreef op donderdag 16 augustus 2007 @ 11:37:
[...]

php ondersteunt idd abstract classes (PHP5), maar dan heb je dus alsnog de tussenkomst van je mainclass
Ja, maar dat is denk ik niet zo erg, het doel was feitelijk $mainclass->subclassfunctie();
zonder voor iedere functie weer wat aparts te hoeven doen in de $mainclass, of elke subclass apart aan te hoeven roepen, waarschijnlijk is die __call daar een mooie oplossing voor.
Deikke schreef op donderdag 16 augustus 2007 @ 11:56:
Een proxy opstellig is denk ik wat je wilt, en dat werkt inderdaad met __call().

Wat je doet is, je kijkt na of 1 of meer bekende onderdelen (opgeslagen in de main class) deze functie heeft/hebben en roept deze vervolgens aan.
Ja, net gelezen op php.net dat ze dat inderdaad een proxy opstelling noemen, ik ga daar eens mee aan de slag.
Bedankt voor jullie antworoden.

[ Voor 67% gewijzigd door SWINX op 16-08-2007 12:00 ]

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


  • Deikke
  • Registratie: Juni 2004
  • Laatst online: 06:44
Een proxy opstellig is denk ik wat je wilt, en dat werkt inderdaad met __call().

Wat je doet is, je kijkt na of 1 of meer bekende onderdelen (opgeslagen in de main class) deze functie heeft/hebben en roept deze vervolgens aan.

Verwijderd

Om die laatste vraag even af te maken:
Wat wil je nu eigenlijk bereiken? (dus los van wat je denkt dat je in code moet doen)

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
Verwijderd schreef op donderdag 16 augustus 2007 @ 12:04:
Om die laatste vraag even af te maken:
Wat wil je nu eigenlijk bereiken? (dus los van wat je denkt dat je in code moet doen)
een "losse" functie uit de subclass aanroepen via een instance van de mainclass.

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd

SWINX schreef op donderdag 16 augustus 2007 @ 12:35:
een "losse" functie uit de subclass aanroepen via een instance van de mainclass.
Dat was dus overduidelijk de vraag niet. Ik wil niet weten wat je in code wilt doen want dat is wel vrij duidelijk. Ik wil weten welke functionaliteit je wilt bouwen. Dus waarvoor je een dergelijke constructie nodig denkt te hebben. Kun je die vraag beantwoorden?

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Ik denk dat Mark een concreet voorbeeld wilt hebben. ;)

ah, te laat.

[ Voor 21% gewijzigd door Grijze Vos op 16-08-2007 12:41 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
ik zat te denken aan een dynamische function library.

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd

SWINX schreef op donderdag 16 augustus 2007 @ 12:45:
ik zat te denken aan een dynamische function library.
Zou je alsjebieft nog iets vager kunnen zijn?

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
we hadden het toch al over "overduidelijk", dus voor jou altijd...

als je in een script/systeem maakt dat veel functies of "modules" (om het zo maar even te noemen) gebruikt, wil je die niet allemaal op elke pagina includen. Je moet dus per deel op kunnen geven welke functies/modules je op een bepaald gedeelte nodig hebt, en deze ga je includen als de subclasses. De mainclass bevat dus de core informatie van het script/systeem en daarop mogen de subclasses weer terugvallen.

Beter zo? ;)

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt


Verwijderd

Ja veel beter. Het is tevens duidelijk iets wat je helemaal niet op eend ergelijk moet willen oplossen. php kent de require_once functie en daarmee kun je prima bereiken wat je wilt. Zorg gewoon voor een goed gestructureerde class library. Desnoods maak je voor een bepaalde namespace/module php bestanden die juiste juiste classes 'require_once'-d. Op die manier hoef je enkel de juiste modules voor je pagina te includen.

  • SWINX
  • Registratie: Juni 2001
  • Laatst online: 23-07 18:19
dat is wat ik nu doe, maar ik blijf nu steeds in het script via de args core info aan mijn subclasses/functies geven, vandaar dat ik aan het speuren was naar een mogelijk alternatief om dat niet te hoeven

[ Voor 12% gewijzigd door SWINX op 16-08-2007 13:00 ]

Mannen komen van Mars Tweakers, vrouwen van Venus Bokt

Pagina: 1