Ik begrijp static niet goed
ik ben bezig met een mvc site, en maak hierin gebruik van static methodes en properties.
In de control heb ik deze code staan:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
public static function getPost($request) {
foreach ($_POST as $key => $value) {
self::$postLogin[$key] =$value;
}
unset($_POST);
$_POST = array();
return self::$postLogin;
}
foreach ($_POST as $key => $value) {
self::$postLogin[$key] =$value;
}
unset($_POST);
$_POST = array();
return self::$postLogin;
}
om de post input te hernoemen naar static properties en
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
public static function getMailTemplate($aanhef, $achternaam, $bericht) {
ob_start();
include ('view/mailTemplate.html');
self::$mailTemplate = ob_get_contents();
ob_end_clean();
return self::$mailTemplate;
}
nu lukt het zonder problemen om overal vandaan de static methode ControlClass::getMailTemplate(),
maar ik krijg foutmeldingen wanneer ik in een andere class bijvoorbeeld de static propertie ControlClass::getPost()[naam] wil aanroepen.
Kan iemand me uitleggen hoe dit zit?
Grote dank valt u alvast ten dele.
Gewijzigd op 23/05/2016 16:03:32 door Medina Wal
Wat zeggen die foutmeldingen?
in mijn editor (dreamweaver) krijg ik er is een syntaxis fout, en als ik de applicatie start, dan stopt hij gewoon. Toegegeven, ik ben zeer zwak in error afhandeling.
Het gaat waarschijnlijk wel goed als je het in tweeën knipt:
Grote dank!!!
Wat ben je eigenlijk aan het doen, dat je in globale classvariabelen aan het schrijven bent maar er schijnbaar niets mee doet? Vreemd gebruik van self::$postLogin en self::$mailTemplate.
Hm, als function array dereferencing (FAD) niet werkt, dan is je PHP versie redelijk oud? In ieder geval < 5.4? Constructies van de vorm something()[2] worden pas vanaf 5.4 ondersteund.
en op mijn hosting provider (versio) 5.5.30
Ben van Velzen op 23/05/2016 20:48:10:
Wat ben je eigenlijk aan het doen, dat je in globale classvariabelen aan het schrijven bent maar er schijnbaar niets mee doet? Vreemd gebruik van self::$postLogin en self::$mailTemplate.
Ach, zo vreemd is het nu ook weer niet, want zelfs Facebook gebruikt dergelijke utilities:
https://github.com/facebook/fbctf/blob/master/src/Utils.php#L87
De methode getPost() in de openingspost doet nu inderdaad nog niets, maar dat kun je later wel refactoren.
In de Model roep ik dit veelvuldig aan, of is een andere manier misschien beter?
Sowieso lees ik op meerdere plekken dat het goed is/zou zijn om globale variabelen zoals $POST te hernoemen naar variabelen. Echter kon ik die dan niet aanroepen vanuit de model of als parameter doorgeven aan de model.
Dus hoe zou jij dat dan doen?
En kijk eens goed: je stopt een $request in de methode, maar daar doe je ook niets mee:
Code (php)
Verder vernietig je $_POST, waardoor die data elders niet meer te gebruiken is. Dat is in de praktijk vooral vervelend als je later ergens eens code van anderen wilt toevoegen. Je legt daarmee in een vroeg stadium een afhankelijkheid vast die later in de weg kan gaan zitten.
En over $_POST heb ik dit gelezen.
Ik vroeg mezelf dit af en ben daarom erg gevoelig gebleken voor deze manier van aanpak.
Ik heb mij trouwens alleen gehouden aan het basis-principe, verder moet ik het nog uitzoeken.
Ik ben nu wel enigszins verward, wat is nu de betere manier?
Gewijzigd op 24/05/2016 10:28:26 door Medina Wal
@Ward: de methode zelf is opzich niet eens zo verkeerd, wat er in de methode gebeurt wel.
Deze regel
in combinatie met deze
Is ontzettend vreemd, zou je ook niet zeggen? Als dit een lokale variabele was was het iets logischer, of zoals het nu gebruikt wordt gewoon return $_POST, dat zou de code ook nog wat leesbaarder maken.
Ik hoop dat Medina inmiddels begrijpt dat er eigenlijk weinig meer gebeurt dan:
Code (php)
of kan ik zelfs return $postLogin en $postLogin[$key] =$value samenvoegen tot return $postLogin[$key] =$value?
Gewijzigd op 24/05/2016 11:15:28 door Medina Wal
Ward van der Put op 24/05/2016 11:04:49:
Maar als je dit doet, dan kan je toch net zo goed gewoon $_POST door het hele script heen blijven gebruiken? maw zinloze code die alleen vertraagd?
https://github.com/symfony/symfony/tree/master/src/Symfony/Component/HttpFoundation, hier zie je één van de verschillende manieren waarop je dat zou kunnen doen.
In dit geval is dat zo, maar er zijn intelligentere manieren om de complete request (dus niet alleen $_POST) te abstraheren. Kijk voor de grap eens naar De manier om de complete request te abstraheren die daar beschreven staat is wel wat teveel voor de praktische toepassing die ik nodig heb, maar het is wel erg leerzaam en ik ga er ook zeker meer over lezen.