{"id":233821,"date":"2023-02-24T09:46:00","date_gmt":"2023-02-24T06:46:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=233821"},"modified":"2022-11-11T12:37:53","modified_gmt":"2022-11-11T09:37:53","slug":"hur-man-implementerar-en-autoloader-med-namnutrymmen-i-ditt-wordpress-tema-eller-plugin","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/sv\/hur-man-implementerar-en-autoloader-med-namnutrymmen-i-ditt-wordpress-tema-eller-plugin\/","title":{"rendered":"Hur man implementerar en autoloader med namnutrymmen i ditt WordPress-tema eller plugin"},"content":{"rendered":"\n<p>Om du skriver objektorienterad kod \u00e4r en autoloader ett m\u00e5ste. Utan en autoloader skulle du beh\u00f6va l\u00e4gga till en rad med att inkludera klassfilen, innan du kan initiera den. Det kan snabbt bli kr\u00e5ngligt n\u00e4r man jobbar med m\u00e5nga klasser. En autoloader \u00e4r en funktion som utl\u00f6ses varje g\u00e5ng en ny klass instansieras och inkluderar klassfilen innan instansieringen sker.<\/p>\n<p>Namnutrymmen \u00e4r ett s\u00e4tt att strukturera och kapsla in din kod och hj\u00e4lper till att undvika namnkollisioner. Om du ska skriva OOP rekommenderas det att du ocks\u00e5 anv\u00e4nder namnrymder. T\u00e4nk p\u00e5 att du kan implementera en autoloader utan att anv\u00e4nda namnutrymmen i din OOP-kod.<\/p>\n<p>Du kan anv\u00e4nda den h\u00e4r koden f\u00f6r ditt WordPress-tema eller plugin, eller vilken PHP-kod som helst utanf\u00f6r WordPress f\u00f6r den delen \u2013 \u00e4ndra bara s\u00f6kv\u00e4garna p\u00e5 motsvarande s\u00e4tt. F\u00f6r det h\u00e4r exemplet skapar jag en autoloader f\u00f6r ett WordPress-tema.<\/p>\n<h2>Regler f\u00f6r klassnamnutrymme och struktur<\/h2>\n<p>Att implementera en autoloader skulle kr\u00e4va vissa definierade regler f\u00f6r din kodstruktur och var man kan hitta dem. Att anv\u00e4nda namnutrymmen f\u00f6renklar detta n\u00e5got, eftersom ditt namnomr\u00e5de kan referera till vilken mapp klasserna finns i.<\/p>\n<p>Ta f\u00f6rst ett beslut om vad ditt namnomr\u00e5de ska heta. Vanligtvis \u00e4r det n\u00e5got unikt f\u00f6r din kod, till exempel ditt temanamn. Till exempel \u00e4r namnutrymmet f\u00f6r den h\u00e4r webbplatsens tema <code>AWhitePixelTheme<\/code>. Det betyder att f\u00f6r att autoloadern ska fungera m\u00e5ste alla klasser finnas inom detta namnutrymme.<\/p>\n<pre><code>namespace AWhitePixelTheme;<\/code><\/pre>\n<p>Min f\u00f6rsta regel \u00e4r att alla klassfiler alltid bara inneh\u00e5ller en klass, och klassnamnet m\u00e5ste vara detsamma som filnamnet. Till exempel; en klass <code>MyTest<\/code>m\u00e5ste definieras i en fil <code>MyTest.php<\/code>.<\/p>\n<p>Min andra regel \u00e4r hur man strukturerar klasserna i mappar. Jag best\u00e4mmer mig f\u00f6r att alla klasser hamnar i en mapp <code>src<\/code>i mitt tema. Jag kan l\u00e4gga klassfiler direkt i den h\u00e4r mappen, och f\u00f6r det m\u00e5ste de finnas i &quot;root&quot;-namnutrymmet som definierats ovan. Men om jag vill skapa undermappar och l\u00e4gga in klassfiler i dem, m\u00e5ste deras namnomr\u00e5den inkludera mappstrukturen. Till exempel en klass fil <code>MyTest.php<\/code>som finns i mappen <code>src\/Test\/<\/code>m\u00e5ste ha detta namnomr\u00e5de definierat:<\/p>\n<pre><code>namespace AWhitePixelThemeTest;<\/code><\/pre>\n<h2>Skapar autoloader<\/h2>\n<p>Jag gillar att h\u00e5lla autoloadern i en separat fil och utanf\u00f6r <code>src\/<\/code>mappen som endast \u00e4r definierad f\u00f6r namnavgr\u00e4nsade klassfiler. Som ett exempel ska jag skapa en fil <code>autoloader.php<\/code>i mappen <code>inc\/<\/code>i mitt tema.<\/p>\n<p>PHP har en inbyggd autoloader-funktion: <a href=\"https:\/\/www.php.net\/manual\/en\/function.spl-autoload-register.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">spl_autoload_register<\/a>. Du anger ditt autoloader-funktionsnamn som parameter, och i den funktionen f\u00e5r du den beg\u00e4rda klassen som argument (det du s\u00e4tter efter <code>new<\/code>n\u00e4r du instansierar klassen). N\u00e4r du instansierar klasser med namnutrymmen, t.ex. <code>new AWhitePixelThemeTestMyTest()<\/code>, skulle den tillhandah\u00e5llna variabeln f\u00f6r denna funktion vara <code>\"AWhitePixelThemeTestMyTest\"<\/code>.<\/p>\n<p>L\u00e5t oss l\u00e4gga till autoloader-funktionen, och i den definierar vi v\u00e5rt n\u00f6dv\u00e4ndiga namnutrymme f\u00f6r autoloader:<\/p>\n<pre><code>&lt;?php\nspl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace = 'AWhitePixelTheme';\n\u00a0\n}<\/code><\/pre>\n<p>Sedan m\u00e5ste vi inkludera den h\u00e4r filen s\u00e5 att v\u00e5r autoloader registreras. Eftersom detta \u00e4r i ett tema kommer jag att l\u00e4gga till inkluderingen i temats <code>functions.php<\/code>. Om du anv\u00e4nder detta f\u00f6r ett plugin, l\u00e4gg det i dina plugin-filer. Autoloader-filen m\u00e5ste l\u00e4ggas till tidigt, innan n\u00e5gon instansiering av klasser. Jag s\u00e4tter detta p\u00e5 den allra f\u00f6rsta raden i min <code>functions.php<\/code>:<\/p>\n<pre><code>require_once(get_template_directory(). '\/inc\/autoloader.php');<\/code><\/pre>\n<p>Om du anv\u00e4nder det f\u00f6r ett barntema eller ett plugin, \u00e4ndra s\u00f6kv\u00e4gen f\u00f6r dina behov.<\/p>\n<p>Och det \u00e4r allt. Nu \u00e4r autoloadern p\u00e5 plats, men den g\u00f6r ingenting. L\u00e5t oss \u00e5terg\u00e5 till autoloader-funktionen och avsluta den.<\/p>\n<h2>Skriver och testar autoloader-funktionen<\/h2>\n<p>F\u00f6rst m\u00e5ste vi se till att det beg\u00e4rda klassnamnet faktiskt finns i v\u00e5rt namnomr\u00e5de. Vi kontrollerar helt enkelt om namnomr\u00e5dets klassnamn som tillhandah\u00e5lls inneh\u00e5ller namnomr\u00e5desstr\u00e4ngen, och om inte, avslutar vi funktionen. Efter det tar vi bort namnomr\u00e5dets namn fr\u00e5n str\u00e4ngen, s\u00e5 att vi kan r\u00e4kna ut alla undermappar och klassfiler.<\/p>\n<pre><code>&lt;?php\nspl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace_name = 'AWhitePixelTheme';\n\u00a0\n    if (strpos($class, $namespace) !== 0) {\n        return;\n    }\n    $class = str_replace($namespace, '', $class);\n}<\/code><\/pre>\n<p>Nu kommer vi att omvandla det angivna namnomr\u00e5det till en faktisk s\u00f6kv\u00e4g till filen. F\u00f6rst kommer vi att ers\u00e4tta eventuellt omv\u00e4nt snedstreck <code>\"\"<\/code>i namnutrymmet med tecknet f\u00f6r mappavgr\u00e4nsare \u2013 f\u00f6r detta anv\u00e4nder vi PHP-konstanten <code>DIRECTORY_SEPARATOR<\/code>. I slutet l\u00e4gger vi till en <code>\".php\"<\/code>. Och slutligen f\u00f6re str\u00e4ngen l\u00e4gger vi till hela rotbanan. Eftersom det h\u00e4r \u00e4r inom ett tema anv\u00e4nder jag <code>get_template_directory()<\/code>. Om du anv\u00e4nder detta f\u00f6r ett plugin, anv\u00e4nd en metod som returnerar hela s\u00f6kv\u00e4gen till din plugin.<\/p>\n<pre><code>    ...\n    $class = str_replace($namespace, '', $class);\n\u00a0\n    $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';\n    $directory = get_template_directory();\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n}<\/code><\/pre>\n<p>Allt vi beh\u00f6ver g\u00f6ra nu \u00e4r att kontrollera om filen finns, och om den g\u00f6r det, kr\u00e4ver den.<\/p>\n<pre><code>    ...\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n\u00a0\n    if (file_exists($path)) {\n        require_once($path);\n    }\n}<\/code><\/pre>\n<p>Det \u00e4r allt!<\/p>\n<p>L\u00e5t oss testa det. Skapa en undermapp <code>Test<\/code>i ditt temas <code>src\/<\/code>mapp och l\u00e4gg in en php-fil med namnet <code>MyTest.php<\/code>. Definiera en klass <code>MyTest<\/code>i den, f\u00f6lj reglerna f\u00f6r namnutrymme: <code>AWhitePixelThemeTest<\/code>. Jag l\u00e4gger bara till en utskrift av &quot;Success&quot; i konstruktionsfunktionen s\u00e5 att vi enkelt kan se att den faktiskt initierar klassen.<\/p>\n<pre><code>&lt;?php\nnamespace AWhitePixelThemeTest;\n\u00a0\nclass MyTest {\n    public function __construct() {\n        var_dump('Success!');\n    }\n}<\/code><\/pre>\n<p>I v\u00e5r functions.php, efter att ha kr\u00e4vt autoloader, instansierar vi helt enkelt klassen:<\/p>\n<pre><code>$test = new AWhitePixelThemeTestMyTest();<\/code><\/pre>\n<p>Uppdatera din WordPress-webbplats och se att du f\u00e5r &quot;Framg\u00e5ng!&quot; matas ut.<\/p>\n<p>Autoloadern kommer att autoladda alla klassfiler som finns inom v\u00e5rt definierade namnomr\u00e5de och f\u00f6ljer de korrekta reglerna. Du kan instansiera klasser fr\u00e5n var som helst inom ditt tema, \u00e4ven inuti sj\u00e4lva klasserna.<\/p>\n<h2>Den fullst\u00e4ndiga autoloader-funktionen<\/h2>\n<p>F\u00f6r referens, h\u00e4r \u00e4r v\u00e5r sista autoloader-funktion:<\/p>\n<pre><code>spl_autoload_register('awhitepixel_autoloader');\nfunction awhitepixel_autoloader($class) {\n    $namespace = 'AWhitePixelTheme';\n\u00a0\n    if (strpos($class, $namespace) !== 0) {\n        return;\n    }\n\u00a0\n    $class = str_replace($namespace, '', $class);\n    $class = str_replace('', DIRECTORY_SEPARATOR, $class). '.php';\n\u00a0\n    $directory = get_template_directory();\n    $path = $directory. DIRECTORY_SEPARATOR. 'src'. DIRECTORY_SEPARATOR. $class;\n\u00a0\n    if (file_exists($path)) {\n        require_once($path);\n    }\n}<\/code><\/pre>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Inspelningsk\u00e4lla:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/awhitepixel.com\" class=\"external external_icon\">awhitepixel.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>En guide i hur man skriver en autoloader som till\u00e5ter namnutrymmen f\u00f6r din objektorienterade kod till ett WordPress-tema eller plugin.<\/p>\n","protected":false},"author":1,"featured_media":224072,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[932,901,724,838,848,901,922,1110,922,838,932,848,724,868,868],"tags":[1173],"class_list":{"0":"post-233821","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","6":"hentry","7":"category-aemnen","8":"category-koda","9":"category-utvecklaren","10":"category-guide-foer-nyboerjare","11":"category-handledningar","13":"category-oevrig","14":"category-n-a","20":"category-wordpress-9","22":"tag-affiai-sv"},"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233821","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=233821"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/posts\/233821\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media\/224072"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/media?parent=233821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/categories?post=233821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/sv\/wp-json\/wp\/v2\/tags?post=233821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}