Ik begrijp static niet goed

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ventilatiesysteem Productontwikkelaar HBO WO Verwa

Samengevat: Zij bieden flexibele ventilatiematerialen, geluidsdempers, rookgasafvoer producten en industrieslangen. Ben jij een technisch productontwikkelaar? Heb jij ervaring met het ontwikkelen van nieuwe producten? Vaste baan: Technisch Productontwikkelaar HBO WO €3.000 - €4.000 Zij bieden een variëteit aan flexibele ventilatiematerialen, geluiddempers, rookgasafvoer producten, industrieslangen en ventilatieslangen voor de scheepsbouw. Met slimme en innovatieve materialen zorgen wij voor een gezonde en frisse leefomgeving. Deze werkgever is een organisatie die volop in ontwikkeling is met hardwerkende collega's. Dit geeft goede ontwikkelingsmogelijkheden. De branche van dit bedrijf is Techniek en Engineering. Functie: Voor de vacature als Technisch Productontwikkelaar Ede Gld HBO WO ga

Bekijk vacature »

Medina Wal

Medina Wal

23/05/2016 16:01:59
Quote Anchor link
Hallo,
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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

om de post input te hernoemen naar static properties en
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
 
PHP hulp

PHP hulp

25/12/2024 09:30:04
 
Ward van der Put
Moderator

Ward van der Put

23/05/2016 16:44:21
Quote Anchor link
>> maar ik krijg foutmeldingen

Wat zeggen die foutmeldingen?
 
Medina Wal

Medina Wal

23/05/2016 17:24:55
Quote Anchor link
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.
 
Ward van der Put
Moderator

Ward van der Put

23/05/2016 18:09:46
Quote Anchor link
Met deze syntaxis hebben oudere versies van PHP inderdaad moeite:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$naam
= ControlClass::getPost()['naam'];
?>

Het gaat waarschijnlijk wel goed als je het in tweeën knipt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$post
= ControlClass::getPost();
$naam = $post['naam'];
?>
 
Medina Wal

Medina Wal

23/05/2016 19:16:48
Quote Anchor link
Werkelijk fantastisch, daar heb ik al een tijdje het net voor afgestruind en de oplossing ziet er eigenlijk veel simpeler uit, dan hoe ik erover aan het denken was...
Grote dank!!!
 
Ben van Velzen

Ben van Velzen

23/05/2016 20:48:10
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

23/05/2016 22:09:24
Quote Anchor link
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.
 
Medina Wal

Medina Wal

24/05/2016 09:11:27
Quote Anchor link
ik heb thuis versie 5.6.0
en op mijn hosting provider (versio) 5.5.30
 
Ward van der Put
Moderator

Ward van der Put

24/05/2016 09:23:55
Quote Anchor link
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.
 
Medina Wal

Medina Wal

24/05/2016 09:40:46
Quote Anchor link
Ben, wat bedoel je precies met dat ik er schijnbaar niks mee doe?
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?
 
Ward van der Put
Moderator

Ward van der Put

24/05/2016 09:53:08
Quote Anchor link
Ben bedoelt dat je niets meer doet dan variabelen kopiëren.
En kijk eens goed: je stopt een $request in de methode, maar daar doe je ook niets mee:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
public static function getPost($request)
{

    foreach ($_POST as $key => $value) {
        self::$postLogin[$key] =$value;
    }

    unset($_POST);
    $_POST = array();
    return self::$postLogin;
}

?>


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.
 
Medina Wal

Medina Wal

24/05/2016 10:09:44
Quote Anchor link
Dit stukje code heb ik gedeeltelijk gekopieerd en ik ging er eigenlijk vanuit dat de request nodig is voor de parameter in ControlClass::getPost()[naam], maar goed nu ik het beter lees, zie ik dat er ook niet meer naar gerefereerd wordt, stom dus.

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
 
Ben van Velzen

Ben van Velzen

24/05/2016 10:52:08
Quote Anchor link
Maar die aanpak zegt niets over het vernietigen van $_POST, dat is ook iets dat je beter niet kunt doen. Het is wel waar dat het binnen frameworks netjes kan zijn om requests te abstraheren, maar dit voelt niet als de juiste manier. Je kunt een Request object maken, waarin je alle facetten van de requests opneemt (GET, POST, URL's, headers, file uploads, de hele zooi). Dan heb je alsnog alle elementen op één plaats.

@Ward: de methode zelf is opzich niet eens zo verkeerd, wat er in de methode gebeurt wel.
Deze regel
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
  self::$postLogin[$key] =$value;
?>

in combinatie met deze
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
  return self::$postLogin;
?>

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.
 
Ward van der Put
Moderator

Ward van der Put

24/05/2016 11:04:49
Quote Anchor link
Ja, dat is wat vreemd, maar ook vanwege het plotseling opduiken van een "Login" in $postLogin lijkt dit een copypaste-mashup uit andere code.

Ik hoop dat Medina inmiddels begrijpt dat er eigenlijk weinig meer gebeurt dan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
public static function getPost()
{

    return $_POST;
}

?>
 
Medina Wal

Medina Wal

24/05/2016 11:14:13
Quote Anchor link
Dus als ik je goed begrijp, dan is dit een betere manier:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
public static function getPost() {
 foreach ($_POST as $key => $value) {
  $postLogin[$key] =$value;
 }

 return $postLogin;
}

?>

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
 
Ben van Velzen

Ben van Velzen

24/05/2016 11:17:51
Quote Anchor link
Zie de reactie van Ward, dit is de code die je nu feitelijk hebt. Niet meer en niet minder:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
public static function getPost()
{

  return $_POST;
}
 
Medina Wal

Medina Wal

24/05/2016 11:18:03
Quote Anchor link
Ward van der Put op 24/05/2016 11:04:49:
Ja, dat is wat vreemd, maar ook vanwege het plotseling opduiken van een "Login" in $postLogin lijkt dit een copypaste-mashup uit andere code.

Ik hoop dat Medina inmiddels begrijpt dat er eigenlijk weinig meer gebeurt dan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
public static function getPost()
{

    return $_POST;
}

?>

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?
 
Ben van Velzen

Ben van Velzen

24/05/2016 11:26:01
Quote Anchor link
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 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.
 
Medina Wal

Medina Wal

24/05/2016 11:35:01
Quote Anchor link
Ok, ik ben echt veel wijzer geworden en enorm geholpen, bedankt.
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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.