PHPでは、 SPL_AUTOLOAD_REGISTER機能により、開発者はクラスのロードメカニズムのオートローダーを登録できます。 PHPが未定義のクラスをインスタンス化しようとすると、登録されたAutoloAD関数が呼び出され、クラスをロードします。このメカニズムは、大規模なアプリケーションとフレームワークで非常に役立ち、開発者がクラスのロードを管理するのに役立ちます。ただし、場合によっては、特にオートローダーを複数回登録する場合は、登録されたオートローダーをクリーニングまたはログアウトする必要がある場合があります。 spl_autoload_unregisterは、このタスクを完了するために使用される関数です。
まず、オートローダーの登録方法を見てみましょう。 SPL_AUTOLOAD_REGISTER関数を使用して、PHPにオートローダーを提供できます。簡単な例を次に示します。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">my_autoloader</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$class</span></span></span><span>) {
</span><span><span class="hljs-keyword">include</span></span><span> </span><span><span class="hljs-string">'classes/'</span></span><span> . </span><span><span class="hljs-variable">$class</span></span><span> . </span><span><span class="hljs-string">'.class.php'</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-string">'my_autoloader'</span></span><span>);
</span></span>
この例では、クラスをロードする必要があるときにmy_autoloader関数が自動的に呼び出され、PHPはクラス/ディレクトリからクラスファイルをロードしようとします。
spl_autoload_unregisterは、以前にspl_autoload_registerに登録されていたオートローダーをログアウトするために使用されます。不要になったオートローダーをログアウトすることにより、オートローダーの紛争やリソースの無駄を避けることができます。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span> ( </span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$autoload_function</span></span><span> )
</span></span>
パラメーター$ autoload_functionは、ログアウトするオートローダーの名前です。この関数は、ログアウトが成功した場合にブール値を返します。それ以外の場合は偽りです。
複数のオートローダーがあり、場合によっては必要のないローダーをクリーンアップしたいとします。これが例です:
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">my_autoloader1</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$class</span></span></span><span>) {
</span><span><span class="hljs-keyword">include</span></span><span> </span><span><span class="hljs-string">'classes1/'</span></span><span> . </span><span><span class="hljs-variable">$class</span></span><span> . </span><span><span class="hljs-string">'.class.php'</span></span><span>;
}
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">my_autoloader2</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$class</span></span></span><span>) {
</span><span><span class="hljs-keyword">include</span></span><span> </span><span><span class="hljs-string">'classes2/'</span></span><span> . </span><span><span class="hljs-variable">$class</span></span><span> . </span><span><span class="hljs-string">'.class.php'</span></span><span>;
}
</span><span><span class="hljs-comment">// 2つのオートローダーを登録します</span></span><span>
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-string">'my_autoloader1'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-string">'my_autoloader2'</span></span><span>);
</span><span><span class="hljs-comment">// 最初のオートローダーからログアウトします</span></span><span>
</span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span>(</span><span><span class="hljs-string">'my_autoloader1'</span></span><span>);
</span></span>
この例では、 my_autoloader1とmy_autoloader2の両方がautoloadersとして登録されていますが、その後、 spl_autoload_unregisterを呼び出すことでmy_autoloader1をログアウトします。このようにして、クラスがロードされたときにmy_autoloader2のみが呼び出されます。
オートローダーへの呼び出しは、それらが登録されている順序で実行されることに注意する必要があります。 spl_autoload_registerの順序は、PHPがクラスをロードしようとする順序を決定します。この注文を変更する必要がある場合は、さまざまな優先順位でオートローダーを登録することを選択できます。たとえば、優先パラメーターを渡すことにより、 spl_autoload_registerはオートローダーの優先度を決定できます。
<span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-string">'my_autoloader1'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>); </span><span><span class="hljs-comment">// 優先度が高い</span></span><span>
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-string">'my_autoloader2'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>); </span><span><span class="hljs-comment">// 優先度が低い</span></span><span>
</span></span>
複数のオートローダーが登録されている場合、特定のローダーをクリーニングまたはログアウトすることが特に重要です。オートローダーの数が増加し続けると、競合や不必要な負荷につながる可能性があります。したがって、必要に応じて、役に立たないオートローダーをログアウトすると、コードのパフォーマンスと保守性が向上する可能性があります。
たとえば、開発中にモジュールを頻繁に切り替えたり、コードベースを更新したりした場合、使用しない自動装置をログアウトする必要がある場合があります。
<span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span>(</span><span><span class="hljs-string">'old_autoloader'</span></span><span>);
</span></span>
このようにして、リソースの無駄を避けて、必要な自動剤を使用することを確認できます。
SPL_AUTOLOAD_UNREGISTERは、特にオートローダーを複数回登録する場合、オートローダーを管理およびクリーンアップするのに役立つ非常に便利な機能です。この機能を合理的に使用することにより、競合を回避し、オートローダーでの重複荷重を再現することができ、それによりアプリケーションのパフォーマンスが向上します。
実際の開発では、自動ローダーの登録とキャンセルの合理的な使用は、大規模なコードベースを管理し、コードをよりモジュール化し柔軟にするのに役立ち、コードの実行効率を改善するのにも役立ちます。