In een vorige les hier over Nettuts +, leer je over PSR; In dit artikel is echter niet ingegaan op het integratieproces van die coderingsstijl in uw projecten. Laten we dat oplossen!
Notitie: dit artikel gaat ervan uit dat je PSR-Huh hebt gelezen en begrijp waar PSR naar verwijst. Laten we beginnen met de eerste standaard: PSR-0.
De PHPCS-plugin is de meest nuttige tool die ik heb gebruikt.
In het verleden hebben we PHP-bestanden op twee manieren opgenomen:
Er zijn voor- en nadelen aan beide benaderingen, maar ik denk dat we het er allemaal over eens zijn dat het evenmin optimale of moderne oplossingen zijn. PHP5 introduceerde het concept van autoloading-bestanden op basis van hun klassenamen; PSR-0 is dus bedoeld om bestandsnamen consistent te houden.
Namespaces hebben niets te maken met bestandsnamen of autoloading; je kunt technisch verschillende namespaces in hetzelfde bestand declareren. De volgende code is bijvoorbeeld perfect geldig.
Er zijn er twee
Hallo
klassen in dit ene bestand, maar ze bevinden zich binnen verschillende naamruimten. De laatste twee regels van deze code geven een instantie van deHallo()
klassen op hun respectieve naamruimten. De eerste uitgangen "Nettuts +", terwijl de tweede echo's "Gabriel." Met naamruimten kunt u onderscheid maken tussen twee klassen met dezelfde naam, net zoals u gewend bent met mappen op uw bureaublad. De PSR-0-standaard maakt eenvoudig gebruik van de voordelen van naamruimten, waardoor het eenvoudig is om uw klassen automatisch te laden. Door uw bestanden consequent een naam te geven, kunt u een functie maken die automatisch de benodigde bestanden opzoekt.Om PSR-1 compliant te zijn, moet je ook PSR-0 volgen.
Zorg ervoor dat u de volledige standaard leest, maar om samen te vatten:
.php
uitbreiding.Een klasseverwijzing van bijvoorbeeld:
\ Nettuts \ Database \ SQL_Postgres
als je PSR-0 volgt, moet dit naar dit pad worden vertaald:
./Nettuts/Database/SQL/Postgres.php
Hoe kunnen we deze functionaliteit implementeren? De meest voor de hand liggende oplossing is om Composer te gebruiken, die wordt geleverd met een PSR-0-compatibele autoloader. Als u Composer gebruikt in uw projecten (en dat zou u moeten doen), kies dan voor de autoloader in plaats van deze zelf te schrijven.
Met een lader die voldoet aan PSR-0 kunt u een basispad opgeven en de lader op de hoogte stellen in welke directory het eerst moet worden gekeken. Maak een eenvoudige om te beginnen composer.json
bestand met de volgende JSON:
"autoload": "psr-0": "Nettuts": "./", "Gmanricks": "vendor /"
Dit JSON-bestand vertelt Composer dat we de PSR-0-standaard willen gebruiken om alles automatisch te laden Nettuts
-namespaced-bestanden met de huidige map (de hoofdmap) als het basispad. We willen ook alle klassen autoload met de Gmanricks
naamruimte, ten opzichte van de verkoper
map (bijv. ./ Verkoper / Gmanricks / ClassName
).
Type nu "componist installeren
"om autoload-klassen te genereren, of"componist dump-autoload
"bij volgende bewerkingen om de autoload-klassen te regenereren. Vergeet ook niet om de autoloader ergens vroeg in uw project te vereisen.
Composer is je beste optie, maar er kunnen scenario's zijn wanneer je een kleine, eenvoudige autoloader wilt. De PHP-FIG biedt een voorbeeldautoloader die u kunt gebruiken:
function __autoload ($ className) $ className = ltrim ($ className, '\\'); $ fileName = "; $ namespace ="; if ($ lastNsPos = strrpos ($ className, '\\')) $ namespace = substr ($ className, 0, $ lastNsPos); $ className = substr ($ className, $ lastNsPos + 1); $ fileName = str_replace ('\\', DIRECTORY_SEPARATOR, $ namespace). DIRECTORY_SEPARATOR; $ fileName. = str_replace ('_', DIRECTORY_SEPARATOR, $ className). '.Php'; vereisen $ fileName;Het is belangrijk op te merken dat deze loader alle klassen probeert te laden met behulp van de PSR-standaard in de huidige map.
Nu we met succes klassen kunnen autoloaden, gaan we verder met de volgende standaard: de standaard coderingsnorm.
PSR-1 - De standaard voor standaard codering
PSR-1 definieert algemene coderingsrichtlijnen, die in twee delen kunnen worden verdeeld.
Naamconventies
Met naamruimten kunt u onderscheid maken tussen twee klassen met dezelfde naam.
Zoals met elke programmeertaal, maakt het volgen van naamconventies uiteindelijk het eenvoudiger om uw code te lezen en te onderhouden. Hier zijn een paar regels om te volgen:
CONSTANT_VARIABLE
).Er is meer aan de hand dan conventies benoemen; volg deze richtlijnen ook:
of =
in uw code. Sluit PHP niet binnen een klas af.
De meeste hiervan spreken voor zichzelf, maar de middelste conventie is enigszins verwarrend. Het dicteert in wezen dat elke verklaring, of het nu gaat om functies, klassen, enz., Gescheiden moet worden in hun eigen bestanden. Dit bevordert niet alleen best practices zoals code-hergebruik en scheiding, maar het houdt uw code netjes en schoon.
Het is vermeldenswaard dat elke PSR-standaard voortbouwt op de vorige PSR-standaard. Als zodanig, om PSR-1 compliant te zijn, moet je ook PSR-0 volgen. Door deze twee standaarden te volgen, zal uw code correct namespaced en autoloaded zijn. Er is echt geen reden om ze niet te volgen.
Ja, sommige ontwikkelaars klagen over PSR en volgen liever andere conventies, maar door deze standaard te volgen, kunt u code met iedereen delen zonder u zorgen te maken over de consistentie ervan. Dat gezegd hebbende, niemand dwingt hier je hand. Het is gewoon een aanbevolen richtlijn.
De volgende standaard, PSR-2, duikt in op de details van hoe je je code moet structureren.
PSR-2 duikt in de details van hoe u uw code moet structureren.
Vervolgens komen we tot de enige norm waar ontwikkelaars van PHP het meest mee worstelen; in feite is dit de reden waarom ik ervoor koos om dit artikel te schrijven.
PSR-2 definieert veel regels, waarvan er veel hieronder worden opgesomd:
namespace
en gebruik
declaraties.abstract
'/'laatste
'zoekwoorden moeten vóór de zichtbaarheid verschijnen'statisch
'gaat na.Zorg ervoor dat u de volledige specificatie bekijkt voor een volledig overzicht.
PSR-2 is net zo belangrijk als PSR-1 (en PSR-0). Het is van plan om de code gemakkelijk te kunnen lezen en onderhouden. Maar zoals ze zeggen, "De duivel is in de details."Er zijn veel details om te onthouden, wat moeilijk kan zijn als je programmeergewoonten verschillen van wat de standaard definieert. Gelukkig, als je aan boord bent, zijn er tools die je helpen om je te houden aan PSR-0, PSR-1 en PSR-2 Misschien is de beste tool de Sublime Text plug-in, PHPCS.
De PHPCS-invoegtoepassing is de handigste tool die ik heb gebruikt om code in vorm te krijgen. Hiermee kunt u er niet alleen voor zorgen dat uw code voldoet aan de PSR-normen, maar wordt ook de linter van PHP gebruikt om te controleren op syntaxisfouten. Dit is een geweldige tijdsbesparing; u hoeft zich geen zorgen meer te maken over syntaxisfouten wanneer u uw code test in de browser.
Installeer het pakket via Sublime Package Control (het wordt Phpcs genoemd) of, als alternatief, met Git, met behulp van de volgende opdrachten:
cd ~ / Bibliotheek / Toepassing \ Ondersteuning / Sublieme \ Tekst \ 2 / Pakketten / git clone git: //github.com/benmatselby/sublime-phpcs.git Phpcs
Hiermee installeer je de plug-in, maar je hebt een paar afhankelijkheden nodig voordat je PHPCS kunt configureren. Nogmaals, de gemakkelijkste manier om ze te installeren is met Composer. Blader naar een map van uw keuze en maak een composer.json
bestand met de volgende JSON:
"name": "Nettuts PHPCS Demo", "require": "squizlabs / php_codesniffer": "*", "fabpot / php-cs-fixer": "*", "phpmd / phpmd": "*"
Hiermee installeert u de drie afhankelijkheden in de huidige map. Open een terminalvenster naar uw installatielocatie en typ componist installeren
, en het zal de nodige pakketten downloaden.
Nu kunt u de plug-in in Sublime Text configureren. Navigeer naar 'Voorkeuren'> 'Pakketinstellingen'> 'PHP Code Sniffer'> 'Instellingen - Gebruiker'.
De plug-in moet weten waar de drie afhankelijkheden zich bevinden, evenals de norm waaraan we onze code willen houden:
"phpcs_additional_args": "--standard": "PSR2", "-n": "", "phpcs_executable_path": "DEPENDENCY_PATH / vendor / bin / phpcs", "phpmd_executable_path": "DEPENDENCY_PATH / vendor / bin / phpmd "," php_cs_fixer_executable_path ":" DEPENDENCY_PATH / vendor / bin / php-cs-fixer "
Deze instellingen informeren PHPCS dat we de PSR2-standaard willen bereiken en het pad van elke afhankelijkheid willen bieden. Vergeet niet te vervangen DEPENDENCY_PATH
met je eigenlijke pad.
Start Sublime opnieuw en de code sniffer scant uw code wanneer u uw PHP-bestanden opslaat.
Door met de rechtermuisknop in de editor te klikken, worden ook een aantal nieuwe opties weergegeven, zoals het wissen van foutmarkeringen en het proberen de niet-standaard problemen op te lossen. Gezien het punt van dit artikel echter is om u aan de standaard te laten wennen, stel ik voor om uw code handmatig te corrigeren en de automatische fixeerbad voorzien zijn van.
De PSR-standaarden zijn gemaakt zodat code gemakkelijk van project tot project kan worden hergebruikt, zonder in te boeten aan consistentie in codestijl. Hoewel ze in het begin misschien overweldigend lijken, kunt u de ideeën en hulpmiddelen van dit artikel gebruiken om u te helpen de overstap te maken.
Om nog een keer te herhalen: niemand dwingt je om de manier waarop je code in PHP verandert te veranderen. Het is gewoon een handleiding, oorspronkelijk bedoeld voor interoperabiliteit van het framework. Dat gezegd hebbende, bij Nettuts + vinden we het een goede gewoonte om te volgen. Maak nu je eigen mening! Als u vragen heeft, laten we ze hieronder horen!