현재 위치: > 최신 기사 목록> spl_autoload_unregister가 해결됩니까? 지정된 자동 로더를 정확하게 제거하는 방법을 가르쳐주십시오

spl_autoload_unregister가 해결됩니까? 지정된 자동 로더를 정확하게 제거하는 방법을 가르쳐주십시오

gitbox 2025-08-07
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 코드 의이 부분은 기사의 내용과 관련이 없습니다.,순수한 장식</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;h1&gt;기술 기사 데모&lt;/h1&gt;"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"&lt;p&gt;이 기사는 소개합니다 PHP 가운데 spl_autoload_unregister 기능 사용 세부 사항。&lt;/p&gt;"</span></span><span>;
</span><span><span class="hljs-meta">?&gt;</span></span><span>

&lt;hr&gt;

</span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/*
 * spl_autoload_unregister 해결 될까요??지정된 자동 로더를 정확하게 제거하는 방법을 가르쳐주십시오
 *
 * 존재하다 PHP 가운데,자동 로딩 메커니즘은 클래스 로딩을 크게 용이하게합니다,尤其是존재하다面向물체开发가운데。
 * 통과하다 spl_autoload_register 여러 자동로드 함수를 등록 할 수 있습니다,
 * 그리고 spl_autoload_unregister 특정 자동 로딩 기능을 로그 아웃하는 데 사용됩니다。
 * 
 * 하지만,有不少开发者존재하다사용 spl_autoload_unregister 나는 그것을했을 때 그것을 만났다“오류를 해결하십시오”문제,
 * 즉, 원래 로그 아웃을 원했던 자동 로더는 제대로 출시되지 않았습니다.,이 프로그램은 여전히 자동 로딩 기능을 호출합니다。
 * 
 * 이 기사는 심층 분석을 수행합니다 spl_autoload_unregister 행동,
 * 并지정된 자동 로더를 정확하게 제거하는 방법을 가르쳐주십시오,피하다“오류를 해결하십시오”。
 */</span>

</span><span><span class="hljs-comment">// 하나、spl_autoload_register 그리고 spl_autoload_unregister 소개</span></span><span>
</span><span><span class="hljs-comment">// spl_autoload_register — 注册하나个函数作为 __autoload() 구현</span></span><span>
</span><span><span class="hljs-comment">// spl_autoload_unregister — 注销하나个已注册的自动加载函数</span></span><span>

</span><span><span class="hljs-comment">// 등록 예</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_autoload</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$className</span></span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"로드 클래스:<span class="hljs-subst">$className</span></span></span><span>\n";
}
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-string">'my_autoload'</span></span><span>);

</span><span><span class="hljs-comment">// 제거 예제</span></span><span>
</span><span><span class="hljs-comment">// 如果传入的回调函数그리고注册时传入的完全相同,성공적으로 만 취소합니다</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_autoload'</span></span><span>); </span><span><span class="hljs-comment">// 릴리스 성공</span></span><span>

</span><span><span class="hljs-comment">// 둘、릴리스가 실패하는 이유(“오류를 해결하십시오”)?</span></span><span>

<span class="hljs-comment">/*
 * 1. 传入的回调参数不하나致
 *    PHP 콜백이 동일한 지 결정할 때,要求完全하나致:
 *    - 문자열 함수 이름 인 경우,名字必须完全하나样
 *    - 배열이라면,배열 내용은 정확히 동일해야합니다(클래스 이름/물체 + 메소드 이름)
 *    - 匿名函数必须传递同하나个实例,재정의 된 익명 함수는 다른 것으로 취급됩니다
 * 
 * 2. 익명 기능으로 인해 해결하기 어려움
 *    익명의 기능은 익명이므로,매번 쓰십시오 new Closure() 모두 다른 예입니다,
 *    无法통과하다 spl_autoload_unregister 풀어 주다,참조가 저장되지 않는 한。
 * 
 * 3. 풀어 주다前没有确认回调存존재하다
 *    尝试풀어 주다未注册的回调,PHP 오류 가보고되지 않았습니다,그러나 그것은 적용 할 수 없습니다。
 */</span>

</span><span><span class="hljs-comment">// 삼、如何精准풀어 주다指定的自动加载器?</span></span><span>

<span class="hljs-comment">/*
 * 1. 콜백 함수 참조를 유지하십시오
 *    익명 기능을 사용하여 등록하는 경우,참조는 먼저 저장해야합니다,나중에 취소 할 수 있습니다。
 */</span>
</span><span><span class="hljs-variable">$loader</span></span><span> = </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$class</span></span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"익명 클래스를로드하십시오 <span class="hljs-subst">$class</span></span></span><span>\n";
};
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>(</span><span><span class="hljs-variable">$loader</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-variable">$loader</span></span><span>);

<span class="hljs-comment">/*
 * 2. 사용明确的函数或静态메소드 이름注册,풀어 주다时直接用同名即可
 */</span>
</span><span><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span> </span><span><span class="hljs-title">Loader</span></span><span> {
    </span><span><span class="hljs-keyword">public</span></span><span> </span><span><span class="hljs-built_in">static</span></span><span> </span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">load</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$class</span></span></span><span>) {
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Loader 로드 클래스:<span class="hljs-subst">$class</span></span></span><span>\n";
    }
}
</span><span><span class="hljs-title function_ invoke__">spl_autoload_register</span></span><span>([</span><span><span class="hljs-string">'Loader'</span></span><span>, </span><span><span class="hljs-string">'load'</span></span><span>]);
</span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span>([</span><span><span class="hljs-string">'Loader'</span></span><span>, </span><span><span class="hljs-string">'load'</span></span><span>]);

<span class="hljs-comment">/*
 * 3. 先통과하다 spl_autoload_functions() 현재 등록 된 모든 자동로드 기능을 얻으십시오,
 *    대상 함수의 비교,确认存존재하다后再풀어 주다。
 */</span>
</span><span><span class="hljs-variable">$registered</span></span><span> = </span><span><span class="hljs-title function_ invoke__">spl_autoload_functions</span></span><span>();
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$registered</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$callback</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$callback</span></span><span> === </span><span><span class="hljs-string">'my_autoload'</span></span><span>) {
        </span><span><span class="hljs-title function_ invoke__">spl_autoload_unregister</span></span><span>(</span><span><span class="hljs-string">'my_autoload'</span></span><span>);
        </span><span><span class="hljs-keyword">break</span></span><span>;
    }
}

<span class="hljs-comment">/*
 * 4. 권장 캡슐화 자동 로더 관리,统하나注册与풀어 주다,피하다遗漏回调引用。
 */</span>

</span><span><span class="hljs-comment">// 네、요약</span></span><span>

<span class="hljs-comment">/*
 * - spl_autoload_unregister 풀어 주다的是完全相同的回调实例。
 * - 익명 함수는 변수를 저장해야합니다,才能풀어 주다。
 * - 사용 spl_autoload_functions() 현재 등록 된 자동 로더를보십시오,피하다풀어 주다错误。
 * - 자동로드 콜백 관리를 표준화하십시오,피하다풀어 주다失败。
 *
 * 이 기술을 마스터하십시오,能让你精准풀어 주다指定的自动加载器,피하다 PHP 자동 로딩 혼돈。
 */</span>

</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>