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 ofzoDan maar een minder elegante methode toepassen
1 2 3 4 | $this->Posts->create(); $this->Posts->save(array('body' => 'TVP')); ?> |
Mja, maar het gaat hier om een groot project met ongeveer 25 subclasses onder A. OO is er nou juist voor bedoeld om code te kunnen hergebruiken, niet om alsnog generieke stukken code overal te plakken..quote:Op woensdag 15 april 2009 10:41 schreef Light het volgende:
Gewoon foo() kopieren naar de Klasse B. Dan gaat het wel goed.
Daar heb je wel een punt. En code 25 keer kopieren is ook niet bevorderlijk voor de onderhoudbaarheid. Dus zul je op zoek moeten naar een oplossing zonder static functies.quote:Op woensdag 15 april 2009 10:47 schreef Intrepidity het volgende:
[..]
Mja, maar het gaat hier om een groot project met ongeveer 25 subclasses onder A. OO is er nou juist voor bedoeld om code te kunnen hergebruiken, niet om alsnog generieke stukken code overal te plakken..
1 2 3 4 5 6 7 8 9 10 11 | <script src="includes/jquery.imgpreview.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $('ul#first a').imgPreview(); }); </script> <ul id="first"> <li><a href="test/thumb/Blauweheuvels.jpg">AAA</a></li> </ul> |
Heb dit in de door ajax gelaadde pagina gegooid; wordt geen alert getoond...quote:Op vrijdag 17 april 2009 00:08 schreef Intrepidity het volgende:
Misschien dat 'ie omdat het een AJAX request is het ready-event nooit gooit? Het document is immers al lang ready voordat die extra content dmv AJAX wordt ingeladen.. Kun je niet eens een alert of wat anders in $(document).ready zetten om te kijken of ie dat event uberhaupt wel tegenkomt?
Probeer dit anders eens:
http://docs.jquery.com/Ajax/load#urldatacallback
Door middel van jquery een AJAX-request uitvoeren, waarbij je een callback op kunt geven, waarin je dus je je jQuery-code kunt uitvoeren.
1 2 3 4 5 | $(document).ready(function() { alert('Test Test'); }); </script> |
1 2 3 4 5 6 | if ($topic->title == "[PHP/(My)SQL] voor dummies - Deel 71") { require_once("/user/DionysuZ"); $post = new tvp; } ?> |
Ik kan niet eens een js functie direct aanroepen vanuit die pagina. Wel in de onmouseover een alertje, maar zo wil ik het niet...quote:Op vrijdag 17 april 2009 00:23 schreef markiemark het volgende:
[..]
Heb dit in de door ajax gelaadde pagina gegooid; wordt geen alert getoond...
[ code verwijderd ]
quote:Op vrijdag 17 april 2009 11:39 schreef markiemark het volgende:
[..]
Ik kan niet eens een js functie direct aanroepen vanuit die pagina. Wel in de onmouseover een alertje, maar zo wil ik het niet...
quote:Probeer dit anders eens:
http://docs.jquery.com/Ajax/load#urldatacallback
Door middel van jquery een AJAX-request uitvoeren, waarbij je een callback op kunt geven, waarin je dus je je jQuery-code kunt uitvoeren.
Zou dit ook moeten werken als het document de ready status heeft? In tegenstelling tot de 'gewone' javascript functie waar ik de alert aanroep?quote:
Een klasse schrijven om mysqli heen met het singleton patroon is de gebruikelijke optiequote:Op vrijdag 17 april 2009 17:55 schreef daReaper het volgende:
Ik ben overgestapt naar mysqli en ik gebruik de OOP variant, alleen nu zit ik met het volgende. Elke keer dat ik nu mysql wil aanspreken in een functie, moet ik $db eerst "globallen". Is hier geen andere manier voor?
1 2 | een test |
ik zou beginnen met de juiste vertaling: "this is a test".quote:Op zaterdag 18 april 2009 15:25 schreef Chandler het volgende:
Weet iemand een regex onderdeel waarmee ik het volgende kan vervangen.
[ code verwijderd ]
nu zie je in bovenstaande tekst meerdere spaties en een enter staan.
stel ik wil 'dit is een test' vervangen met 'this is an test' (dus naar het engels vertalen).
dan doe ik dat normaal zo
$code = preg_replace("$1this is an test$2",
"#([>^_-])' . preg_quote("dit is een test") . "([<^_-])#ism",
$code);
echter neemt hij dan woorden niet mee die meer spaties bevatten en of een enter in de zin hebben, dit wil ik nu wel.. hoe kan ik dit oplossen? heb zelf al geprobeerd om alle spaties met ([:space:]+?[\r\n]+) te vervangen waardoor ik dacht dat deze zou werken.. maar helaas..
Anyone?
1 2 3 4 5 | $s = "dit is\n een test"; $s = preg_replace("/dit\s+is\s+een\s+test/", "this is a test", $s); print $s; ?> |
1 2 3 4 5 6 | array( array('Pedagogie', 'uitgangspunten'), array('Aanbod', 'aanbod'), array('Ervaringen', 'ervaringen'), )); |
1 2 3 4 5 6 7 8 9 | if ($spec1 == $menu["kinderopvang"][2][0][1]) include("pages/kinderopvang_uitgangspunten.php"); if ($spec1 == $menu["kinderopvang"][2][1][1]) include("pages/kinderopvang_aanbod.php"); if ($spec2 == 'introductie') include("pages/kinderopvang_aanbod_introductie.php"); if ($spec1 == $menu["kinderopvang"][2][2][1]) include("pages/kinderopvang_ervaringen.php"); ?> |
1 2 3 4 5 6 | array( array('Ouders', 'ouders'), array('Kinderopvang', 'kinderopvang'), array('Voor alle geinteresseerden', 'geinteresseerden'), )); |
1 2 3 4 5 6 7 | if ($spec1 == $menu["agenda"][2][0][1]) include("pages/agenda_ouders.php"); if ($spec1 == $menu["agenda"][2][1][1]) include("pages/agenda_kinderopvang.php"); if ($spec1 == $menu["agenda"][2][2][1]) include("pages/agenda_geinteresseerden.php"); ?> |
dan klopt de include natuurlijk niet. Als je vanuit directory "pages/" een pagina opvraagt als "pages/agenda_ouders.php" dan include hij vanuit de root directory "pages/pages/agenda_ouders.php".quote:
http://pikler.nl/pages/agenda.phpquote:Warning: main(pages/kinderopvang_uitgangspunten.php) [function.main]: failed to open stream: No such file or directory in /home/sites/site6046/web/pages/kinderopvang.php on line 3
...
Met als grote verschil dat kinderopvang.php ook in de root (http://pikler.nl/kinderopvang.php) bestaat, en agenda.php niet.quote:Warning: main(pages/agenda_ouders.php) [function.main]: failed to open stream: No such file or directory in /home/sites/site6046/web/pages/agenda.php on line 3
...
1 2 3 4 5 6 7 | if ($spec1 == $menu["agenda"][2][0][1]) include("agenda_ouders.php"); if ($spec1 == $menu["agenda"][2][1][1]) include("agenda_kinderopvang.php"); if ($spec1 == $menu["agenda"][2][2][1]) include("agenda_geinteresseerden.php"); ?> |
1 2 3 4 5 6 7 8 9 | RewriteCond %{REQUEST_URI} ^/emmi-pikler [OR] RewriteCond %{REQUEST_URI} ^/pedagogische-visie [OR] RewriteCond %{REQUEST_URI} ^/stichting [OR] RewriteCond %{REQUEST_URI} ^/ouders [OR] RewriteCond %{REQUEST_URI} ^/kinderopvang [OR] RewriteCond %{REQUEST_URI} ^/agenda [OR] RewriteCond %{REQUEST_URI} ^/contact RewriteRule (.*) /index.php |
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |