quote:
quote:Op maandag 13 april 2009 14:39 schreef slacker_nl het volgende:
$this->post("tvp");
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | abstract class A { public static function foo() { self::bar(); // Werkt niet, geeft melding dat bar() niet bestaat in klasse A } } class B extends A { public static function bar() { // Deze functie wil ik dus laten aanroepen } } B::foo(); ?> |
Je moet de aanwezigheid van bar garanderen, dus hem als abstract declaren in Aquote:Op dinsdag 14 april 2009 15:05 schreef Intrepidity het volgende:
Hoe kan ik vanuit een abstracte klasse refereren naar de daadwerkelijk aangeroepen child-klasse? Voorbeeld:
[ code verwijderd ]
self werkt hier dus niet, omdat het ondanks de child-klasse altijd naar de abstracte klasse zal verwijzen.. Hoe los ik dit op?
Er zijn meerdere klassen die A extenden, en die allemaal een eigen implementatie van bar() hebben..
Dat werkt ook niet:quote:Op dinsdag 14 april 2009 15:09 schreef Thomass het volgende:
[..]
Je moet de aanwezigheid van bar garanderen, dus hem als abstract declaren in A
Waarom zijn foo() en bar() static? Als je de verwijzing static weghaalt en self:: vervangt door $this-> dan moet het gewoon werken.quote:Op dinsdag 14 april 2009 15:05 schreef Intrepidity het volgende:
Hoe kan ik vanuit een abstracte klasse refereren naar de daadwerkelijk aangeroepen child-klasse? Voorbeeld:
[ code verwijderd ]
self werkt hier dus niet, omdat het ondanks de child-klasse altijd naar de abstracte klasse zal verwijzen.. Hoe los ik dit op?
Er zijn meerdere klassen die A extenden, en die allemaal een eigen implementatie van bar() hebben..
Daar heeft het weinig mee te maken.. klasse B is een uitbreiding op klasse A en erft dus al zijn properties en methodes, static of niet, en moet die ook kunnen gebruiken.. dat de PHP compiler niet snapt dat het in dit geval tijdens runtime self:: moet vervangen door B:: lijkt mij een foutje.. De methodes zijn static omdat ik die juist wil gebruiken om een object te instantieren op een bepaalde manier. Concreet: bar() is een functie die een database-record omzet naar een instantie van een object, foo() wordt een functie die een hele array databaserijen in een keer kan omzetten naar een array met objecten. Aangezien alleen de implementatie van bar() verschillend is per overervende klasse en foo() slechts een domme foreach loop is die tig keer bar() moet aanroepen (die ik niet wil copy-pasten in iedere subclass, das nou juist het idee van OO) leek dit me de juiste oplossing..quote:Op dinsdag 14 april 2009 19:52 schreef Arjan321 het volgende:
Ik denk dat het wel werkt als je ze niet static maakt.. Betwijfel of overerving werkt bij statics, aangezien die niet gevonden zijn aan een instantie maar aan een klasse.
Als je dat standaard doet na een upload / copy gaat het altijd goed natuurlijkquote:Op dinsdag 14 april 2009 15:08 schreef Thomass het volgende:
Hoe los je zoiets op? In het phpscript chownen nadat je een bestand maakt / verplaatst kan je een keer vergeten natuurlijk, is er een beter oplossing?
Hm, ja daar heb je denk ik wel een punt.quote:Op dinsdag 14 april 2009 20:50 schreef Intrepidity het volgende:
[..]
Daar heeft het weinig mee te maken.. klasse B is een uitbreiding op klasse A en erft dus al zijn properties en methodes, static of niet, en moet die ook kunnen gebruiken.. dat de PHP compiler niet snapt dat het in dit geval tijdens runtime self:: moet vervangen door B:: lijkt mij een foutje.. De methodes zijn static omdat ik die juist wil gebruiken om een object te instantieren op een bepaalde manier. Concreet: bar() is een functie die een database-record omzet naar een instantie van een object, foo() wordt een functie die een hele array databaserijen in een keer kan omzetten naar een array met objecten. Aangezien alleen de implementatie van bar() verschillend is per overervende klasse en foo() slechts een domme foreach loop is die tig keer bar() moet aanroepen (die ik niet wil copy-pasten in iedere subclass, das nou juist het idee van OO) leek dit me de juiste oplossing..
quote:... static method calls are resolved at compile time. When using an explicit class name the method is already identified completely and no inheritance rules apply. If the call is done by self then self is translated to the current class, that is the class the code belongs to. Here also no inheritance rules apply.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public function __call($name, $args) { switch(sizeof($args)) { case 1: return $this->template->$name($args[0]); break; case 2: return $this->template->$name($args[0], $args[1]); break; default: return $this->template->$name(); break; } } ?> |
Zoiets misschien?quote:Op dinsdag 14 april 2009 22:13 schreef daReaper het volgende:
Hoe herschrijf ik deze functie zodat ik die switch niet nodig heb en het ook werkt met meer dan 2 elementen in $args?
[ code verwijderd ]
1 2 3 | return call_user_func_array(this->template->$name, $args); } |
ik krijg:quote:Op dinsdag 14 april 2009 22:30 schreef nightsleeper het volgende:
[..]
Zoiets misschien?
[ code verwijderd ]
Aan de andere kant is een static functie geen onderdeel van een specifiek object. Het is een onderdeel van de class en alle objecten van die class hebben exact dezelfde functie. Dat effect is nog duidelijker bij een static variabele, als je die in object1 aanpast, heeft object2 dezelfde aanpassing gezien.quote:Op dinsdag 14 april 2009 20:50 schreef Intrepidity het volgende:
[..]
Daar heeft het weinig mee te maken.. klasse B is een uitbreiding op klasse A en erft dus al zijn properties en methodes, static of niet, en moet die ook kunnen gebruiken.. dat de PHP compiler niet snapt dat het in dit geval tijdens runtime self:: moet vervangen door B:: lijkt mij een foutje.. De methodes zijn static omdat ik die juist wil gebruiken om een object te instantieren op een bepaalde manier. Concreet: bar() is een functie die een database-record omzet naar een instantie van een object, foo() wordt een functie die een hele array databaserijen in een keer kan omzetten naar een array met objecten. Aangezien alleen de implementatie van bar() verschillend is per overervende klasse en foo() slechts een domme foreach loop is die tig keer bar() moet aanroepen (die ik niet wil copy-pasten in iedere subclass, das nou juist het idee van OO) leek dit me de juiste oplossing..
Maar we hebben het hier ook niet over objecten maar over de klasse. Klasse B is een A, dus heeft alle methoden van A ook.. Een static methode is inderdaad geen onderdeel van een object, maar daar heb ik het ook helemaal niet over. Ik roep iets static aan op B, wat overerft van A, en dat dus ook moet kunnen gebruiken. Overerving gaat niet op object-niveau maar op klasse-niveau...quote:Op dinsdag 14 april 2009 23:00 schreef Light het volgende:
[..]
Aan de andere kant is een static functie geen onderdeel van een specifiek object. Het is een onderdeel van de class en alle objecten van die class hebben exact dezelfde functie. Dat effect is nog duidelijker bij een static variabele, als je die in object1 aanpast, heeft object2 dezelfde aanpassing gezien.
Als je dingen uit een database leest en in een specifieke class wilt stoppen dan kun je ook eens kijken naar mysql_fetch_object()
Wat is het alternatief, als ik jullie discussie even onderbreken mag?quote:Op woensdag 15 april 2009 09:49 schreef Intrepidity het volgende:
[..]
maar srsly, gebruikt er nog iemand mysql_* functies tegenwoordig?
mysqli, of PDO. Zelf gebruik ik al een poos PDO, werkt erg prettigquote:Op woensdag 15 april 2009 10:22 schreef daReaper het volgende:
[..]
Wat is het alternatief, als ik jullie discussie even onderbreken mag?
Als ik een class A heb met een static variabele, en die class heeft 2 subclasses, namelijk B en C, dan hebben B en C diezelfde static variabele. Verander ik de waarde bij B dan verandert ook de waarde bij C (tenzij er in C een static variabele met dezelfde naam is gedeclareerd).quote:Op woensdag 15 april 2009 09:49 schreef Intrepidity het volgende:
[..]
Maar we hebben het hier ook niet over objecten maar over de klasse. Klasse B is een A, dus heeft alle methoden van A ook.. Een static methode is inderdaad geen onderdeel van een object, maar daar heb ik het ook helemaal niet over. Ik roep iets static aan op B, wat overerft van A, en dat dus ook moet kunnen gebruiken. Overerving gaat niet op object-niveau maar op klasse-niveau...
Ik gebruik nog wel mysql_* functies. Weliswaar niet direct, maar gewoon aangeroepen vanuit een database-class, maar evengoed wordt er mysql_* gebruikt. En het ging mij er gewoon om dat je met mysql_fetch_object een class kunt opgeven. Eerst worden de databasevelden in het object geladen, daarna wordt de constructor aangeroepen. Dus je kunt ook in de constructor al het een en ander doen met de velden.quote:Ik fetch mijn data inderdaad al naar een stdClass vanuit de database (maar srsly, gebruikt er nog iemand mysql_* functies tegenwoordig?), maar daar verlies ik flexibiteit mee. Ik wil de mogelijkheid hebben om bijvoorbeeld een categorie_id property in de stdClass om te zetten naar een Categorie-object. Dit kan niet met fetch object, of fetch class, of whatever, dus schrijf ik hier een eigen functie voor. OO werken en dan vervolgens nog klooien met id's lijkt me ook weer niet handig..
Gewoon foo() kopieren naar de Klasse B. Dan gaat het wel goed.quote:Anyway, blijkbaar kan het gewoon niet ofzo Dan maar een minder elegante methode toepassen
1 2 3 4 | $this->Posts->create(); $this->Posts->save(array('body' => 'TVP')); ?> |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |