{"id":228614,"date":"2022-10-29T09:21:00","date_gmt":"2022-10-29T06:21:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=228614"},"modified":"2022-11-09T03:16:09","modified_gmt":"2022-11-09T00:16:09","slug":"namnutrymmen-och-autoladdning-i-wordpress","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/namnutrymmen-och-autoladdning-i-wordpress\/","title":{"rendered":"Namnutrymmen och autoladdning i WordPress"},"content":{"rendered":"\n<p>F\u00f6rra veckan h\u00f6ll jag min presentation p\u00e5 <a href=\"https:\/\/2017.atlanta.wordcamp.org\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">WordCamp Atlanta<\/a> om namnutrymmen och automatisk laddning. (den fullst\u00e4ndiga titeln var Namespaces, Autoloading, and Improving Plugin Architecture, men det \u00e4r en munfull, eller hur?)<\/p>\n<p>P\u00e5 grund av f\u00f6redragets natur har jag valt att skriva ett inl\u00e4gg som \u00e5tf\u00f6ljer inl\u00e4gget, dela bilderna och dela ett exempel p\u00e5 plugin GitHub f\u00f6r att st\u00f6dja f\u00f6redraget.<\/p>\n<p>S\u00e5 om du var p\u00e5 plats, tack(!) och h\u00e4r kommer inl\u00e4gget, jag lovade. Och f\u00f6r er som inte deltog hoppas jag att det h\u00e4r inl\u00e4gget fortfarande hj\u00e4lper till att demonstrera de koncept och \u00e4mnen <a href=\"https:\/\/tommcfarlin.com\/wordcamp-atlanta-2017\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">jag diskuterade p\u00e5 WordCamp<\/a>.<\/p>\n<h2>Namnutrymmen och automatisk laddning<\/h2>\n<p>Innan jag pratar om namnutrymmen och autoladdning i WordPress \u00e4r anledningen till att jag vill prata om detta f\u00f6r att det direkt kan p\u00e5verka kvaliteten p\u00e5 din kod och det kan g\u00f6ra det i m\u00e5nader och \u00e5r fram\u00f6ver.<\/p>\n<p>N\u00e4r allt kommer omkring \u00e4r det inte m\u00e5nga av oss utvecklare som redan st\u00e4ller fr\u00e5gan:<\/p>\n<blockquote>\n<p>Hur kan vi g\u00f6ra v\u00e5r kod b\u00e4ttre \u00e4n den redan \u00e4r?<\/p>\n<\/blockquote>\n<p>Och m\u00e5nga av oss \u00e4r smarta nog att veta det vi inte vet. S\u00e5 vi st\u00e5r inf\u00f6r att arbeta inom de begr\u00e4nsningar vi f\u00e5r.<\/p>\n<p>Ibland har vi tid att unders\u00f6ka s\u00e4tt att g\u00f6ra detta; andra g\u00e5nger arbetar vi med den kunskap vi har. Och det \u00e4r inget fel med det.<\/p>\n<p>Men eftersom vi vet vad vi inte vet vet vi att det finns potential f\u00f6r mer.<\/p>\n<h3>F\u00f6rst, din kod<\/h3>\n<p>N\u00e4r det kommer till att prata om \u00e4mnen som namnutrymmen och autoloading i WordPress-sammanhang tror jag att vi ofta m\u00f6ts av blandade svar.<\/p>\n<p>N\u00e4r allt kommer omkring kan vi prata om saker som <a href=\"https:\/\/codex.wordpress.org\/Theme_Customization_API\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Theme Customizer<\/a> eller <a href=\"https:\/\/developer.wordpress.org\/rest-api\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">REST API<\/a> eller n\u00e5got roligare.<\/p>\n<p>Jag menar, &quot;namespaces and autoloading&quot; l\u00e5ter helt enkelt inte sp\u00e4nnande eller fram\u00e5triktat n\u00e4r det j\u00e4mf\u00f6rs med de nyare funktionerna och teknikerna som \u00e4r tillg\u00e4ngliga, eller hur?<\/p>\n<p>Men nej, de \u00e4r inte riktigt tr\u00e5kiga. Och genom det h\u00e4r inl\u00e4gget och den medf\u00f6ljande presentationen och k\u00e4llkoden kommer jag att visa dig varf\u00f6r och hur de inte \u00e4r det.<\/p>\n<h4>De \u00e4r inte tr\u00e5kiga<\/h4>\n<p>Jag tycker att det \u00e4r r\u00e4ttvist att s\u00e4ga att utvecklare \u2013 \u00e5tminstone en del av oss eller en del av dem beroende p\u00e5 hur du ser dig sj\u00e4lv \u2013 \u00e4r \u00f6k\u00e4nda f\u00f6r att br\u00e5ka om aspekter av programmering.<\/p>\n<p>&quot;Tr\u00e5kigt samtal i alla fall.&quot;<\/p>\n<p>Det \u00e4r faktiskt inte alls ovanligt att h\u00f6ra n\u00e5gon br\u00e5ka om det b\u00e4sta s\u00e4ttet att initiera och skriva en for-loop som \u00e4r s\u00e5 presterande som m\u00f6jligt n\u00e4r man itererar \u00f6ver en liten upps\u00e4ttning databas trots att vi har fyrk\u00e4rniga processorer och 16 GB RAM i v\u00e5ra station\u00e4ra maskiner.<\/p>\n<p>S\u00e5 om vi bryr oss s\u00e5 mycket om n\u00e5got s\u00e5 litet, s\u00e5 bryr vi oss om den st\u00f6rre bilden. Saker som:<\/p>\n<ul>\n<li>F\u00f6rb\u00e4ttrad kod<\/li>\n<li>B\u00e4ttre organisation<\/li>\n<li>\u00d6kad underh\u00e5llsbarhet<\/li>\n<li>Enklare fels\u00f6kning<\/li>\n<li>Tj\u00e4na mer pengar (tja, kanske).<\/li>\n<\/ul>\n<p>Och namnutrymmen och automatisk laddning kan leda direkt till allt ovan (ja, jag kan inte prata om pengar, men det har potential).<\/p>\n<p>Om jag skulle sammanfatta rollnamnrymden och autoloadingplatsen i allt ovan, skulle jag s\u00e4ga att:<\/p>\n<p>Namnutrymmen och autoloading leder till f\u00f6rb\u00e4ttrad kod genom b\u00e4ttre organisation, uppdelning eller modularisering och t\u00e4tare relation genom deras koncept.<\/p>\n<p>Detta \u00f6kar dessutom underh\u00e5llbarheten eftersom koden \u00e4r organiserad i paket vilket kan leda till enklare fels\u00f6kning n\u00e4r produkten v\u00e4xer.<\/p>\n<p>Allt detta kan leda till att spara tid eller en b\u00e4ttre anv\u00e4ndning av tid, vilket beroende p\u00e5 din aff\u00e4rsmodell kan p\u00e5verka ditt resultat.<\/p>\n<p>Men detta beskriver fortfarande inte n\u00e5gon av dessa saker. Men visst, vid det h\u00e4r laget l\u00e5ter de mer intressanta \u00e4n n\u00e4r de f\u00f6rst introducerades.<\/p>\n<h4>S\u00e5 vad \u00e4r de?<\/h4>\n<p>Innan vi g\u00e5r in p\u00e5 definitionerna av var och en och de roller de spelar, l\u00e5t oss ta en titt p\u00e5 hur bristen p\u00e5 namnutrymmen och automatisk laddning i WordPress har p\u00e5verkat din upplevelse negativt n\u00e4r du anv\u00e4nder teman, plugins, till\u00e4gg eller vad du nu har.<\/p>\n<p>S\u00e5 l\u00e5t oss backa ett \u00f6gonblick och titta p\u00e5 var och en av dem individuellt.<\/p>\n<h5>Namnutrymmen<\/h5>\n<p>F\u00f6rest\u00e4ll dig att du har \u00e4rvt ett projekt och att du ska b\u00f6rja arbeta med det. S\u00e4g att det \u00e4r ett WordPress-plugin.<\/p>\n<p>Du installerar det; du g\u00e5r f\u00f6r att aktivera den och sedan f\u00e5r du minst en av dessa:<\/p>\n<ul>\n<li>Du kanske ser det d\u00e4r ot\u00e4cka organiseringsmeddelandet h\u00f6gst upp i webbl\u00e4sarf\u00f6nstret som visar en stacksp\u00e5rning.<\/li>\n<li>Kanske ser du ett meddelande som talar om n\u00e5gon konflikt med ett annat befintligt paket.<\/li>\n<li>Eller kanske n\u00e4r du f\u00f6rs\u00f6ker aktivera ett plugin s\u00e5 uppdateras sidan men pluginet aktiveras inte.<\/li>\n<li>Kanske har du till och med gjort en kodgranskning, och du ser klass_exists-kontroller i hela kodbasen.<\/li>\n<\/ul>\n<p>N\u00e5got eller allt av ovanst\u00e5ende kan naturligtvis bidra till problem med WordPress-projekt. Men namnutrymmen kan verkligen fixa mycket av detta f\u00f6r det mesta.<\/p>\n<p>Det \u00e4r sagt, anledningen till att du upplever dessa problem \u00e4r att koden som du arbetar med \u00e4r en del av det globala namnomr\u00e5det (mot dess namnutrymme) och PHP gillar inte n\u00e4r det finns klasser och moduler som heter samma sak .<\/p>\n<p>Men n\u00e4r du namnger n\u00e5got, ger du det dess omr\u00e5de i f\u00f6rh\u00e5llande till sig sj\u00e4lv som fortfarande kommer att spela bra med andra komponenter \u00e4ven om de har samma klassnamn.<\/p>\n<h5>Autoloaders<\/h5>\n<p>N\u00e4r det g\u00e4ller autoloaders \u00e4r de lite mindre komplicerade p\u00e5 vissa s\u00e4tt. T\u00e4nk f\u00f6rst p\u00e5 koden du skriver eller koden som du arbetar med \u2013 s\u00e4rskilt inom ramen f\u00f6r WordPress-plugins \u2013 och t\u00e4nk sedan p\u00e5 hur m\u00e5nga g\u00e5nger du skriver eller ser f\u00f6ljande:<\/p>\n<ul>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.include.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">omfatta<\/a><\/li>\n<li>inkludera_en g\u00e5ng<\/li>\n<li><a href=\"https:\/\/php.net\/manual\/en\/function.require.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">beh\u00f6va<\/a><\/li>\n<li>kr\u00e4ver_en g\u00e5ng<\/li>\n<\/ul>\n<p>Och ibland ser du dem \u00f6verst i filen som startar plugin-programmet, och ibland ser du dem utspridda i kodbasen.<\/p>\n<p>Om de alla finns i en enda fil \u00e4r det inte s\u00e5 illa eftersom du \u00e5tminstone vet var de \u00e4r. Men om de \u00e4r nedskr\u00e4pade \u00f6verallt, d\u00e5 har du ingen aning om var ett beroende f\u00f6rs in i systemet.<\/p>\n<p>Autoloading kan l\u00f6sa allt detta genom att ladda beroenden n\u00e4r det beh\u00f6vs (och f\u00f6r de som \u00e4r intresserade \u00e4r autoloading snabbare \u00e4n manuell inkludering).<\/p>\n<h2>Namnutrymmen<\/h2>\n<p>Med allt detta sagt \u00e4r vi redo att prata om b\u00e5de <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">namnutrymmen<\/a> och autoloading. Men namnutrymmen \u00e4r det grundl\u00e4ggande konceptet, s\u00e5 vi b\u00f6rjar d\u00e4r.<\/p>\n<p>Men efter allt ovanst\u00e5ende kan du se f\u00f6rdelarna med att anv\u00e4nda dem. De kanske till och med \u00e4r roliga, eller hur? Kanske?<\/p>\n<p>Oavsett vilket beh\u00f6ver vi en definition som vi kan arbeta med n\u00e4r vi pratar igenom detta f\u00f6r resten av artikeln.<\/p>\n<p>PHP-manualen <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.rationale.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ger f\u00f6ljande definition<\/a> :<\/p>\n<blockquote>\n<p>Namnomr\u00e5den \u00e4r designade f\u00f6r att l\u00f6sa tv\u00e5 problem som f\u00f6rfattare till bibliotek och applikationer st\u00f6ter p\u00e5 n\u00e4r de skapar \u00e5teranv\u00e4ndbara kodelement som klasser eller funktioner&#8230;<\/p>\n<\/blockquote>\n<p>Och det \u00e4r inte d\u00e5ligt, men det \u00e4r ganska l\u00e5ngt, tekniskt, och det kan vara lite mycket f\u00f6r dem som precis har b\u00f6rjat. S\u00e5 l\u00e5t oss f\u00f6renkla det lite f\u00f6r den h\u00e4r artikeln:<\/p>\n<p>Lite b\u00e4ttre kanske?<\/p>\n<blockquote>\n<p>Ett s\u00e4tt att gruppera relaterade klasser och gr\u00e4nssnitt med liknande syfte.<\/p>\n<\/blockquote>\n<p>Jag t\u00e4nker inte prata om gr\u00e4nssnitt i det h\u00e4r f\u00f6redraget; Men jag vet att det finns objektorienterade utvecklare p\u00e5 medelniv\u00e5 som anv\u00e4nder dem, s\u00e5 jag ville vara s\u00e4ker p\u00e5 att jag \u00e5tminstone n\u00e4mner dem.<\/p>\n<h3>Ett praktiskt exempel<\/h3>\n<p>Jag gillar inte programmeringsexempel som inte ger verkliga eller praktiska till\u00e4mpningar. Ofta f\u00e5r vi exempel p\u00e5 saker som vi aldrig skulle kodifiera.<\/p>\n<p>Hur m\u00e5nga g\u00e5nger har du l\u00e4st en objektorienterad artikel och den ger ett exempel p\u00e5 en djurklass eller en bilklass? Vi kommer inte att programmera en bil.<\/p>\n<p>Vi \u00e4r mycket mer ben\u00e4gna att arbeta med filer. S\u00e5 vi kommer att ta en titt p\u00e5 en upps\u00e4ttning klasser som ansvarar f\u00f6r att l\u00e4sa och skriva filer. Det vill s\u00e4ga, vi har varit bra objektorienterade programmerare och separerat v\u00e5ra klasser utifr\u00e5n det ansvar de har.<\/p>\n<p>Och ja, du kanske har gr\u00e4nssnitt; de faller dock utanf\u00f6r den h\u00e4r artikeln, s\u00e5 de kommer inte att inkluderas.<\/p>\n<p>S\u00e5 f\u00f6r v\u00e5r FileReader kanske grunderna i klassen ser ut s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1413b1bb.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1413b1bb.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>En klass f\u00f6r att l\u00e4sa filer.<\/p>\n<p>Observera att funktionen accepterar namnet p\u00e5 filen som den ska \u00f6ppna f\u00f6r att l\u00e4sa. Felkontrollen, hur den l\u00e4ser filen och vad den returnerar \u00e4r allt upp till implementeringen av klassen.<\/p>\n<p>Och f\u00f6r FileWriter har vi n\u00e5got s\u00e5nt h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a143c699f.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a143c699f.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>En klass f\u00f6r att skriva filer.<\/p>\n<p>Den h\u00e4r klassen, \u00e5 andra sidan, accepterar informationen som den ska skriva till disken och namnet p\u00e5 filen som den ska skrivas till.<\/p>\n<p>\u00c5terigen, som med exemplet ovan, inkluderar det inte felkontroll, skriva via en resurs, st\u00e4nga resurserna och s\u00e5 vidare.<\/p>\n<p>Men det h\u00e4r handlar inte om att arbeta med filer. Ist\u00e4llet handlar det om att visa hur du namnger din kod, och dessa tv\u00e5 exempel \u00e4r t\u00e4nkta att vara grundl\u00e4ggande f\u00f6r det.<\/p>\n<h3>Anteckningar om namnutrymmen<\/h3>\n<p>Det finns en varning till vad du ser i bilderna av exempelkoden ovan: Dessa klasser \u00e4r inte namnavgr\u00e4nsade. Det vill s\u00e4ga, de bor i det globala namnutrymmet vilket g\u00f6r dem mogna f\u00f6r konflikter med andra klasser.<\/p>\n<p>Se p\u00e5 det s\u00e5 h\u00e4r: F\u00f6rest\u00e4ll dig att du paketerar den h\u00e4r koden i ett plugin f\u00f6r n\u00e5gon annan, och sedan laddar de ett annat plugin som ocks\u00e5 har som en FileReader eller en FileWriter. Eftersom det hela kommer att ing\u00e5 i samma <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.global.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">globala namnutrymme<\/a>, kommer du att st\u00e4llas inf\u00f6r en konflikt.<\/p>\n<p>Kom ih\u00e5g:<\/p>\n<blockquote>\n<p>Namnutrymmen \u00e4r ett s\u00e4tt att gruppera relaterade klasser och gr\u00e4nssnitt med liknande syfte.<\/p>\n<\/blockquote>\n<p>S\u00e5 l\u00e5t oss ta klasserna och namnutrymmet koden.<\/p>\n<p>F\u00f6rst kommer vi att tillhandah\u00e5lla ett namnomr\u00e5de p\u00e5 toppniv\u00e5 d\u00e4r dessa klasser och alla andra klasser kommer att ligga; sedan tillhandah\u00e5ller vi ett underpaket (eller undernamnutrymme eller underutrymme som jag har h\u00f6rt dem kallade) i vilket dessa filklasser kommer att finnas.<\/p>\n<p>Det betyder att v\u00e5r FileReader nu kommer att se ut s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a146586f4.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a146586f4.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>En namnavgr\u00e4nsad klass f\u00f6r att l\u00e4sa filer.<\/p>\n<p>Och v\u00e5r FileWriter kommer nu att se ut s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1487e5b2.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1487e5b2.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>En namnavgr\u00e4nsad klass f\u00f6r att skriva filer.<\/p>\n<p>F\u00f6rst kan du se att det \u00e4r enkelt att anv\u00e4nda namnutrymmen: Du anv\u00e4nder helt enkelt nyckelordet namnomr\u00e5de och deklarerar sedan namnomr\u00e5det (som lika g\u00e4rna kan vara WCATL) \u00f6verst med underpaketen efter.<\/p>\n<p>Men detta leder till andra \u00e4mnen \u2013 n\u00e4mligen kring filorganisation, instansiering och autoloading \u2013 som alla \u00e4r v\u00e4rda att ta upp.<\/p>\n<h3>P\u00e5 filorganisation<\/h3>\n<p>Vid det h\u00e4r laget \u00e4r det viktigt att ha ett ord om filorganisation. Beroende p\u00e5 vem du pratar med kommer du att uppt\u00e4cka att vissa utvecklare \u2013 \u00f6verraskning, \u00f6verraskning \u2013 har en \u00e5sikt om hur filer ska organiseras (och jag \u00e4r inte annorlunda).<\/p>\n<p>\u00c5 ena sidan beh\u00f6ver du inte organisera dina filer alls. Faktum \u00e4r att du kan sl\u00e4ppa varenda sak i rotkatalogen f\u00f6r ditt projekt, namnge informationen och vara redo att g\u00e5.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14ab117d.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14ab117d.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>Oorganiserade filer<\/p>\n<p>Ovanst\u00e5ende upps\u00e4ttning filer \u00e4r f\u00f6r ett litet projekt, s\u00e5 du kan f\u00f6rest\u00e4lla dig hur m\u00e5nga filer som skulle finnas f\u00f6r ett stort projekt.<\/p>\n<p>Men n\u00e4r du har dina filer organiserade s\u00e5 h\u00e4r kan det g\u00f6ra det lite sv\u00e5rt att skriva en autoloader eftersom en autoloader beh\u00f6ver veta var den ska hitta filerna baserat p\u00e5 deras namnutrymme.<\/p>\n<p>Det \u00e4r h\u00e4r begreppen &quot;logisk organisation&quot; och &quot;virtuell organisation&quot; kommer in i bilden.<\/p>\n<ul>\n<li>Logisk organisation h\u00e4nvisar till hur filerna \u00e4r organiserade p\u00e5 disken, som det du ser ovan. De \u00e4r logiskt placerade i rotkatalogen.<\/li>\n<li>Virtuell organisation h\u00e4nvisar till hur filerna \u00e4r organiserade med avseende p\u00e5 deras namnutrymmen. Det betyder att det finns kataloger och underkataloger som mappar till namnomr\u00e5dena, underpaketen och s\u00e5 vidare.<\/li>\n<\/ul>\n<p>S\u00e5 om du skulle ta ovanst\u00e5ende projekt, dess namnomr\u00e5den, dess underpaket och sedan organisera dem b\u00e5de logiskt och virtuellt, skulle det se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14d9a198.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14d9a198.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>Namnutrymmen och automatisk laddning: organiserade filer<\/p>\n<p>Och \u00e4ven om du kan v\u00e4lja att organisera dina filer som du vill, \u00e4r jag ett fan av att se till att det finns paritet mellan de tv\u00e5. Det vill s\u00e4ga, jag gillar att min logiska och min virtuella organisation matchar som du ser p\u00e5 bilden ovan.<\/p>\n<p>N\u00e4r jag g\u00e5r \u00f6ver till att diskutera automatisk laddning, kommer du att se varf\u00f6r detta \u00e4r viktigt.<\/p>\n<h2>Anteckningar om namnutrymmen<\/h2>\n<p>Vad h\u00e4nder dock n\u00e4r vi beh\u00f6ver instansiera klasser som \u00e4r namnavgr\u00e4nsade? N\u00e4r klasser inte har namnintervall \u00e4r det l\u00e4tt att anv\u00e4nda nyckelordet &quot;nya&quot;.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14f8414e.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a14f8414e.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>Instantiering utan namnutrymme.<\/p>\n<p>Men vi m\u00e5ste instansiera en namnavgr\u00e4nsad klass, vi m\u00e5ste ta det ett steg l\u00e4ngre och anv\u00e4nda det fullt kvalificerade namnet:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1519c7ff.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1519c7ff.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>Namnutrymmen och autoladdning: Instantiering med ett namnomr\u00e5de.<\/p>\n<p>Men det h\u00e4r blir kr\u00e5ngligt, eller hur? Det h\u00e4r exemplet \u00e4r inte s\u00e5 illa, men t\u00e4nk om du jobbade p\u00e5 n\u00e5got med fler underpaket. Det skulle bli ganska kr\u00e5ngligt, eller hur?<\/p>\n<p>F\u00f6r det \u00e4ndam\u00e5let kan vi anv\u00e4nda det som kallas aliasing. Det \u00e4r enkelt ocks\u00e5. Vi kan definiera anv\u00e4nd nyckelordet &#8217;anv\u00e4nd&#8217; h\u00f6gst upp i filen f\u00f6r att h\u00e4nvisa till namnomr\u00e5det vi vill alias och sedan anv\u00e4nda det sista underpaketet som en del av aliaset f\u00f6r att instansiera v\u00e5r klass.<\/p>\n<p>L\u00e5ter f\u00f6rvirrande, eller hur? Kanske hj\u00e4lper det att se det i aktion:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1541531b.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1541531b.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>Aliasing namnrymder.<\/p>\n<p>Och det \u00e4r allt som finns. Ja, du kan <a href=\"https:\/\/php.net\/manual\/en\/language.namespaces.importing.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">ta aliasing ett steg l\u00e4ngre<\/a>, men det h\u00e4r \u00e4r s\u00e5 l\u00e5ngt jag tar det i samband med den h\u00e4r artikeln.<\/p>\n<h2>Automatisk laddning<\/h2>\n<p>Vid det h\u00e4r laget har vi lagt grunden f\u00f6r autoloading. Ja, att arbeta genom namnutrymmen kan vara mycket jobb om du inte \u00e4r van vid det; det \u00e4r dock viktigt att f\u00f6rst\u00e5 eftersom autoloading kr\u00e4ver lite arbete som kan vara ov\u00e4ntat om du aldrig har blivit introducerad till det tidigare.<\/p>\n<p>Oavsett vilket \u00e4r de viktigaste sakerna att komma ih\u00e5g n\u00e4r det g\u00e4ller namnrymder vid det h\u00e4r laget:<\/p>\n<ol>\n<li>Namnutrymmen \u00e4r ett s\u00e4tt att gruppera relaterade klasser och gr\u00e4nssnitt med liknande syfte.<\/li>\n<li>Skapa paritet genom dina filer och namnutrymmen och se till att din logiska och virtuella organisation \u00e4r densamma.<\/li>\n<\/ol>\n<p>Och nu \u00e4r det faktiskt dags att titta p\u00e5 autoloading.<\/p>\n<h3>Anm\u00e4rkningar om automatisk laddning<\/h3>\n<p>L\u00e5t oss f\u00f6rst titta p\u00e5 definitionen av automatisk laddning som tillhandah\u00e5lls <a href=\"https:\/\/php.net\/manual\/en\/language.oop5.autoload.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">av PHP-manualen<\/a> :<\/p>\n<blockquote>\n<p>Funktionen spl_autoload_register() registrerar valfritt antal autoloaders, vilket g\u00f6r att klasser och gr\u00e4nssnitt kan laddas automatiskt om de f\u00f6r n\u00e4rvarande inte \u00e4r definierade. Genom att registrera autoloaders f\u00e5r PHP en sista chans att ladda klassen eller gr\u00e4nssnittet innan det misslyckas med ett fel.<\/p>\n<\/blockquote>\n<p>Inte illa. Den \u00e4r dock l\u00e5ng. S\u00e5 precis som vi gjorde med namnutrymmen, l\u00e5t oss anv\u00e4nda en kortare definition f\u00f6r den h\u00e4r artikeln:<\/p>\n<blockquote>\n<p>Ett s\u00e4tt att automatiskt ladda gr\u00e4nssnitt och klasser utan att anv\u00e4nda include and require-satser.<\/p>\n<\/blockquote>\n<p>\u00c5terigen, vi kommer inte att anv\u00e4nda gr\u00e4nssnitt i den h\u00e4r artikeln \u00e4ven om vissa utvecklare g\u00f6r det. Och det kommer att ge arbetsdefinitionen f\u00f6r resten av denna artikel.<\/p>\n<h3>Ett praktiskt exempel<\/h3>\n<p>N\u00e4r du v\u00e4l har ordnat dina filer, namnrymd och redo att laddas, d\u00e5 \u00e4r det dags att g\u00f6ra just det, eller hur? Jag menar:<\/p>\n<ol>\n<li>dina filer \u00e4r organiserade,<\/li>\n<li>du \u00e4r redo att ladda dem<\/li>\n<\/ol>\n<p>S\u00e5 det \u00e4r dags att g\u00f6ra det automatiskt, eller hur? Men det finns en hake. Hela &quot;automatiskt ladda&quot; filer kr\u00e4ver lite arbete.<\/p>\n<h3>Skriver en autoloader<\/h3>\n<p>Det vill s\u00e4ga, det \u00e4r automatiskt, men det kr\u00e4ver \u00e4nd\u00e5 lite mer arbete fr\u00e5n v\u00e5r sida. Innan du g\u00e5r in i dessa steg \u00e4r det viktigt att notera:<\/p>\n<ol>\n<li>det \u00e4r inte helt automatiserat,<\/li>\n<li>vi m\u00e5ste skriva det.<\/li>\n<\/ol>\n<p>Lika trevligt som det skulle vara att ha koden automatiskt laddad, m\u00e5ste vi l\u00e4sa en del data, analysera den och sedan f\u00f6rs\u00f6ka ladda r\u00e4tt fil.<\/p>\n<p>Men f\u00f6rutsatt att du skriver det ordentligt och ditt namnomr\u00e5de och organiserar dina filer p\u00e5 samma s\u00e4tt f\u00f6r varje projekt, kan du \u00e5teranv\u00e4nda din autoloader. Det vill s\u00e4ga du skriver det en g\u00e5ng, och du kan anv\u00e4nda det i andra projekt.<\/p>\n<h3>Steg f\u00f6r en autoloader<\/h3>\n<p>N\u00e4r du skriver en autoloader finns det bara n\u00e5gra steg att f\u00f6lja. Autoloadern m\u00e5ste kunna svara p\u00e5 f\u00f6ljande filer:<\/p>\n<ol>\n<li>Var \u00e4r filerna?<\/li>\n<li>Hur heter de?<\/li>\n<li>Finns filen?<\/li>\n<\/ol>\n<p>Om allt ovanst\u00e5ende \u00e4r sant (eller du kan svara &quot;ja&quot; p\u00e5 dem alla), s\u00e5 kommer autoloadern att g\u00f6ra vad den ska g\u00f6ra.<\/p>\n<p>Vi ska ta en titt p\u00e5 lite kod om ett \u00f6gonblick, men det f\u00f6rsta att notera \u00e4r att detta anv\u00e4nder en funktion som heter spl_autoload_register.<\/p>\n<p>SPL h\u00e4nvisar till <a href=\"https:\/\/php.net\/manual\/en\/book.spl.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Standard PHP Library<\/a>, och funktionen accepterar en funktion som ett argument, och den funktionen accepterar namnet p\u00e5 klassen som kommer att instansieras. Det \u00e4r mer procedurm\u00e4ssigt \u00e4n objektorienterat, och jag kommer att prata om detta ett \u00f6gonblick, men det \u00e4r viktigt att ha i \u00e5tanke n\u00e4r du l\u00e4ser den h\u00e4r koden.<\/p>\n<p>H\u00e4r \u00e4r den f\u00f6rsta delen av koden. Jag ska f\u00f6rklara vad den g\u00f6r i efterhand:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1562a1b8.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a1562a1b8.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>Autoloading, del 1 \u2013 Hitta klassen<\/p>\n<p>I den h\u00e4r delen av koden f\u00e5r funktionen det fullst\u00e4ndiga namnet p\u00e5 klassen som ska instansieras (som &quot;WCATLFileFileReader()&quot;).<\/p>\n<p>D\u00e4refter delar den upp alla delar av det fullt kvalificerade namnet i delar. Namnet p\u00e5 klassen \u00e4r det sista indexet i arrayen, och jag v\u00e4ljer att namnge mina filer som &quot;class-filereader.php&quot; s\u00e5 att funktionen skapar en variabel, $class_file, som refererar till namnet p\u00e5 filen.<\/p>\n<p>Men vi \u00e4r inte klara \u00e4n. Vi m\u00e5ste fortfarande f\u00e5 det fullt kvalificerade namnet (det vill s\u00e4ga var filen finns p\u00e5 disken). Det h\u00e4r kan se ut ungef\u00e4r s\u00e5 h\u00e4r:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a15910c7c.jpg\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-167194-61e7a15910c7c.jpg\" alt=\"Namnutrymmen och autoladdning i WordPress\" ><\/a><\/p>\n<p>Autoloading, del 2 \u2013 Att f\u00e5 det fullt kvalificerade namnet<\/p>\n<p>Vid det h\u00e4r laget f\u00f6rbereder vi en variabel, $fullst\u00e4ndigt_kvalificerad_s\u00f6kv\u00e4g, som kommer att referera till katalogen p\u00e5 \u00f6versta niv\u00e5n.<\/p>\n<p>D\u00e4refter itererar koden genom alla index i arrayen och skapar en s\u00f6kv\u00e4g till klassfilen. Du kan f\u00f6rest\u00e4lla dig detta som att bygga en str\u00e4ng som &quot;wcatlfile&quot; som vi sedan kombinerar med $class_file.<\/p>\n<p>Detta inneb\u00e4r att den fullt kvalificerade s\u00f6kv\u00e4gen till filen blir &quot;wcatlfileclass-filereader.php.&quot;<\/p>\n<p>Och slutligen inkluderar vi filen. Observera att den h\u00e4r koden inte kontrollerar om filen finns. \u00c4ven om jag rekommenderar det, har det utel\u00e4mnats f\u00f6r l\u00e4ngdens skull och f\u00f6r att vi i v\u00e5rt exempel vet att filen existerar.<\/p>\n<p>Om filen inte finns finns det flera alternativ:<\/p>\n<ol>\n<li>Kasta ett undantag,<\/li>\n<li>F\u00e5nga ett undantag,<\/li>\n<li>Visa ett eget felmeddelande,<\/li>\n<li>Eller n\u00e5got annat alternativ som jag kanske \u00f6verv\u00e4ger i den h\u00e4r artikeln.<\/li>\n<\/ol>\n<p>Oavsett vilket \u00e4r tanken att vara defensiv i din kod s\u00e5 att du kan f\u00f6rbereda dig p\u00e5 fallet att en fil inte existerar och du kan graci\u00f6st hantera felet.<\/p>\n<h3>P\u00e5 Autoloading<\/h3>\n<p>Innan du avslutar \u00e4r det viktigt att notera f\u00f6ljande:<\/p>\n<ul>\n<li>Under hela exemplet har vi anv\u00e4nt objektorienterad kod vid namnavst\u00e5nd fr\u00e5n koden. Det \u00e4r trots allt ett objektorienterat koncept.<\/li>\n<li>V\u00e5r autoloader \u00e4r skriven i procedurkod. Vad ger?<\/li>\n<\/ul>\n<p>I slut\u00e4ndan har detta att g\u00f6ra med standard PHP-biblioteket. Du kan skriva en objektorienterad autoloader, men jag tycker att det \u00e4r lite \u00f6verdrivet i m\u00e5nga fall.<\/p>\n<p>Processen att ladda en fil \u00e4r en steg-f\u00f6r-steg-process s\u00e5 att skriva den p\u00e5 ett procedurm\u00e4ssigt s\u00e4tt \u00e4r en naturlig passform.<\/p>\n<p>Slutligen kan andra v\u00e4lja att anv\u00e4nda verktyg som Composer f\u00f6r att f\u00e5 in beroenden. Det h\u00e4r \u00e4r fantastiska verktyg, och det finns m\u00e5nga f\u00f6rdelar med att anv\u00e4nda n\u00e5got s\u00e5dant h\u00e4r; det \u00e4r dock bortom begreppen och \u00e4mnena i den h\u00e4r artikeln och \u00e4r b\u00e4st att l\u00e4mna f\u00f6r ett framtida f\u00f6redrag.<\/p>\n<h2>Resurser (och tack!)<\/h2>\n<p>Det h\u00e4r har varit en av de l\u00e4ngsta artiklarna jag har skrivit f\u00f6r min webbplats.<\/p>\n<p>Detta \u00e4r delvis f\u00f6r att det \u00e4r baserat p\u00e5 ett f\u00f6redrag f\u00f6r en WordCamp och \u00e4ven f\u00f6r att jag vill se till att jag ger en solid introduktion och grund d\u00e4r du kan b\u00f6rja inf\u00f6rliva namnrymder och autoladda i dina WordPress-plugins.<\/p>\n<p>Ut\u00f6ver den h\u00e4r artikeln har jag \u00e4ven tillhandah\u00e5llit f\u00f6ljande resurser:<\/p>\n<ul>\n<li>Bilderna i min presentation finns <a href=\"https:\/\/speakerdeck.com\/tommcfarlin\/namespaces-and-autoloading-improving-wordpress-plugin-architecture\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">tillg\u00e4ngliga p\u00e5 SpeakerDeck<\/a>.<\/li>\n<li>Jag har koden fr\u00e5n denna presentation tillg\u00e4nglig <a href=\"https:\/\/github.com\/tommcfarlin\/namespaces-and-autoloading-in-wordpress\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">f\u00f6r nedladdning p\u00e5 GitHub<\/a>.<\/li>\n<\/ul>\n<p>Och med det hoppas jag att detta ger en gedigen introduktion till namnf\u00e4lt och autoloading och att du kan b\u00f6rja inf\u00f6rliva detta mer och mer i ditt arbete. Det gynnar ditt arbete och andra utvecklare som kan komma att anv\u00e4nda ditt arbete ocks\u00e5.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Baserat p\u00e5 mitt f\u00f6redrag p\u00e5 WordCamp Atlanta 2017 \u00e4r detta min omfattande artikel om namnrymder och autoladdning i WordPress-utveckling.<\/p>\n","protected":false},"author":1,"featured_media":221177,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[848,901,724,868],"tags":[1173],"class_list":["post-228614","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-handledningar","category-koda","category-utvecklaren","category-wordpress-9","tag-affiai-sv"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228614","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/comments?post=228614"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/228614\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/221177"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=228614"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=228614"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=228614"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}