Bespaar tijd, verminder onderhoudskosten, vereenvoudig uw code en doe het allemaal terwijl u zich een gek persoon voelt! In deze tutorial leert u hoe u variabele variabelen, opzoekmatrices en een beetje slimme programmering gebruikt om formulierhandling op een grote manier te vereenvoudigen.
Voordat we te diep kunnen gaan in het gebruik van een opzoekarray, is het belangrijk om eerst het concept achter variabele variabelen te begrijpen.
Variabele variabele
is een term die het gebruik van een variabele beschrijft om een andere variabele te declareren.
In de eenvoudigste vorm kan een variabele variabele er als volgt uitzien:
$ foo = 'Een waarde!'; // Declareer een beginwaarde $ bar = 'foo'; // Wacht, wat gebeurt er? echo $$ bar; // Heilige rotzooi! Die output 'Een waarde!'
Wanneer u naar een proof of concept kijkt zoals in het vorige voorbeeld, ziet het gebruik van variabele variabelen er waarschijnlijk vrij raar en ingewikkeld uit. Er zijn echter echt solide, praktische redenen om ze in sommige gevallen te gebruiken.
Het verantwoorde gebruik van variabele variabelen kan de hoeveelheid code die moet worden herhaald drastisch verminderen door bijvoorbeeld een associatieve array te converteren naar een object met gedesinfecteerde waarden.
Voorbeeld zonder variabele variabelen
$ comment = nieuwe stdClass (); // Maak een object $ comment-> name = sanitize_value ($ array ['name']); $ comment-> email = sanitize_values ($ array ['email']); $ comment-> url = sanitize_values ($ array ['url']); $ comment-> comment_text = sanitize_values ($ array ['comment_text']);
Voorbeeld met variabele variabelen
$ comment = nieuwe stdClass (); // Maak een nieuw object foreach ($ array als $ key => $ val) $ comment -> $ key = sanitize_values ($ val);
Zie je hoeveel eenvoudiger dat was? En je kunt je voorstellen wat het voorbeeld is zonder variabele variabelen zouden eruit zien als de array iets van 50 of 100 waarden zou hebben.
NOTITIE: Ik ben me ervan bewust dat je ook zou kunnen gebruiken array_map () en heeft de array expliciet als object gebruikt om hetzelfde te bereiken. Dat is niet het punt. We zijn hier een concept aan het illustreren. Speel mee.
Maak formulierverwerking een koud kunstje.
Nu u weet hoe u variabele variabelen kunt gebruiken, kunnen we verder gaan met het vlees en de aardappelen van dit artikel, wat het idee is dat het opnemen van een opzoekmatrix in plaats van meerdere controllerbestanden of een switchinstructie u veel extra onderhoud kan besparen, herhaalde code en hoofdpijn in het algemeen.
Om ons concept te illustreren, gaan we het idee van formulierverwerking gebruiken. Dit is een essentieel aspect van webprogrammering, en kan ook een van de saaiste gebieden van elk project zijn.
Nadat u uw codeergewoonten opnieuw hebt geëvalueerd, kunt u echter de verwerking van formulieren een fluitje van een cent maken.
Vaak wordt een individueel bestand gemaakt voor elk formulier dat moet worden verwerkt, of wordt een switch-instructie gebruikt. In deze sectie bespreken we hoe beide oplossingen kunnen worden geïmplementeerd, waarna we een oplossing onderzoeken met variabele variabelen en hoe deze uw projecten kunnen verbeteren..
Een veelgebruikte methode voor het verwerken van formulierinzendingen is om een geheel nieuw bestand te maken om de gegevens van elk formulier afzonderlijk te behandelen.
Neem bijvoorbeeld deze drie formulieren die een gebruikersaccount bijwerken met een nieuwe naam, nieuwe e-mail of beide:
Elk van deze formulieren wijst naar een ander verwerkingsbestand. Dus hoe ziet elk van deze bestanden eruit?
Verwerkingsformulier 1 (assets / inc / ex1-form1.php)
save_name (); // Voer voor dit voorbeeld slechts enkele gegevens uit over de echo van de formulierinzending "Verwerkingsbestand: ", $ _SERVER ['PHP_SELF']," \ n \ nMethodeoutput:\ n ", $ uitvoer,"\ n ", 'Ga terug
'; else die ('Ongeldige formulierinzending');
Verwerkingsformulier 2 (assets / inc / ex1-form2.php)
save_email (); // Voer voor dit voorbeeld slechts enkele gegevens uit over de echo van de formulierinzending "Verwerkingsbestand: ", $ _SERVER ['PHP_SELF']," \ n \ nMethodeoutput:\ n ", $ uitvoer,"\ n ", 'Ga terug
'; else die ('Ongeldige formulierinzending');
Verwerkingsvorm 3 (assets / inc / ex1-form3.php)
save_both (); // Voer voor dit voorbeeld slechts enkele gegevens uit over de echo van de formulierinzending "Verwerkingsbestand: ", $ _SERVER ['PHP_SELF']," \ n \ nMethodeoutput:\ n ", $ uitvoer,"\ n ", 'Ga terug
'; else die ('Ongeldige formulierinzending');
Zoals je duidelijk kunt zien, dupliceren de bovenstaande voorbeeldbestanden een heleboel code. Vouw dit uit tot 15 formulieren op een site en je zult snel merken dat onderhoud een nachtmerrie kan worden.
Zoals u kunt zien, vormen de verwerkingsbestanden een instantie van de klasse CopterLabs_Account. Dit is een heel eenvoudige klasse die informatie geeft over een formulierinzending.
Hier is de code voor de klas (assets / inc / class.coperlabs_account.inc.php):
* @copyright 2011 Copter Labs * @license http://www.opensource.org/licenses/mit-license.html * @license http://www.gnu.org/licenses/gpl-3.0.txt * / class CopterLabs_Account public $ name = NULL, $ email = NULL; openbare functie save_name () $ this-> name = htmlentities ($ _ POST ['name'], ENT_QUOTES); return "Methode:". __METHOD__. "\ nName:". $ this-> naam. "\ N"; openbare functie save_email () $ this-> email = htmlentities ($ _ POST ['email'], ENT_QUOTES); return "Methode:". __METHOD__. "\ nE-mail:". $ this-> email. "\ N"; public function save_both () $ this-> name = htmlentities ($ _ POST ['name'], ENT_QUOTES); $ this-> email = htmlentities ($ _ POST ['email'], ENT_QUOTES); return "Methode:". __METHOD__. "\ nName:". $ this-> naam. "\ nE-mail:". $ this-> email. "\ N";
U kunt deze code uitproberen in Voorbeeld 1 op de demopagina.
Een andere populaire oplossing voor formulierverwerking is om alle verwerkingsscripts te consolideren in één bestand en te bepalen wat te doen met de gegevens met behulp van een switch-statement.
Bij de switch-benadering wordt meestal een truc gebruikt waarin een verborgen invoer wordt toegevoegd aan het formulier met een actie die moet worden ondernomen bij verzending. Deze
actie wordt vervolgens gebruikt om te bepalen wat te doen met het formulier.
Hier volgen dezelfde drie vormen, van hierboven, met toegevoegde acties die allemaal verwijzen naar een enkel verwerkingsbestand:
En het nieuwe verwerkingsbestand ziet er zo uit: (assets / inc / EX2-switch.php)
save_name (); breken; // Form 2-afhandelingscase 'update-email': $ output = $ account_obj-> save_email (); breken; // Form 3-afhandelingscase 'update-both': $ output = $ account_obj-> save_both (); breken; // Als er geen geldige actie wordt gevonden, is iets niet goed standaard: dobbelsteen ('Niet-ondersteunde actie'); // Voer voor dit voorbeeld gewoon enkele gegevens uit over de echo van de formulierinzending "Verwerkingsbestand: ", $ _SERVER ['PHP_SELF']," \ nActie: ", htmlentities ($ _ POST ['action'], ENT_QUOTES)," \ n \ nMethodeoutput:\ n ", $ uitvoer,"\ n ", 'Ga terug naar voorbeeld 2
'; else die ('Ongeldige formulierinzending');
U kunt dit in actie zien door Voorbeeld 2 te bezoeken op de demopagina. Dit is een duidelijke verbetering ten opzichte van het gebruik van meerdere formulieren, maar u kunt zien dat we nog steeds een aantal code dupliceren.
Bovendien is het een persoonlijke voorkeur van mij om te vermijden schakelaar verklaringen wanneer ik kan. Dit komt door het feit dat schakelaar maakt gebruik van losse vergelijkingen ('Een touwtje' zal activeren geval 0 omdat een string evalueert naar 0 als je het converteert naar een geheel getal) en dat is uiterst gemakkelijk om te zetten in spaghetti-code.
Zoals we tot nu toe hebben gezien, hebben beide oplossingen hun nadelen en hebben ze dubbele code nodig. Stel je voor dat er een tiental of meer formulieren op de site staan - niet mooi.
Om dit probleem aan te pakken, kunnen we een concept met de naam a gebruiken opzoek array, die de acties toewijst die van het formulier zijn doorgegeven aan een methode die op het object wordt aangeroepen.
Ja, u kunt de actie instellen als de naam van de methode, maar hiermee kan een valse formulierverzending elke openbare methode oproepen. De array een sleutel / waarde-paar maken is een kleine stap om wat meer controle toe te voegen zonder veel extra werk.
Met behulp van onze kennis van variabele variabelen aan het begin van deze tutorial, laten we onze demo aanpassen om een opzoekarray te gebruiken.
Wijzig de drie vormen om naar een nieuw controllerbestand te wijzen:
Stel vervolgens het verwerkingsbestand samen dat formulierinzendingen zal verwerken (assets / inc / ex3-lookup-array.php):
'save_name', 'update-email' => 'save_email', 'update-both' => 'save_both'); // Zorg ervoor dat de arraysleutel bestaat als (array_key_exists ($ action, $ lookup_array)) // Variabele variabelen gebruiken, de juiste methode aanroept en de uitvoer $ output = $ account_obj -> $ lookup_array [$ action] () opslaat; else die ('Niet-ondersteunde actie'); // Voer voor dit voorbeeld gewoon enkele gegevens uit over de echo van de formulierinzending "Verwerkingsbestand: ", $ _SERVER ['PHP_SELF']," \ nActie: ", htmlentities ($ _ POST ['action'], ENT_QUOTES)," \ n \ nMethodeoutput:\ n ", $ uitvoer,"\ n ", 'Ga terug naar voorbeeld 3
'; else die ('Ongeldige formulierinzending');
Bekijk dit op de demopagina door de formulieren in Voorbeeld 3 uit te proberen.
Omdat we de actie instellen als de sleutel in de array, gebruiken we array_key_exists () om ervoor te zorgen dat de actie geldig is. Vervolgens gebruiken we de waarde die overeenkomt met de actie als de methode naam. Merk op dat we de haakjes na de waarde hebben toegevoegd om te controleren of deze als een methode is uitgevoerd.
De toevoeging van de opzoekmatrix houdt de code beknopt, eenvoudig en duidelijk (zodra u variabele variabelen onder de knie hebt).
Op een verantwoorde manier gebruikt, kunnen opzoekmatrices uw scripts veel gemakkelijker bijwerken en onderhouden wanneer u ze combineert met variabele variabelen.
Hoe denkt u dat u opzoekmatrices en variabele variabelen in uw projecten kunt integreren om het onderhoud eenvoudiger te maken? Laat het me weten in de comments!