>백엔드 개발 >PHP 튜토리얼 >[Li Jingshan PHP] thinkphp 핵심 소스 코드 기능 PHP |

[Li Jingshan PHP] thinkphp 핵심 소스 코드 기능 PHP |

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2016-07-28 08:25:53952검색

<code><span><?php</span><span>// ------------- ---------------------</span> <span> // | ThinkPHP [ 생각만 하면 할 수 있어요 ]</span><span>// -------------------------- --------------</span><span>// | 저작권 (c) 2006-2014 http://thinkphp.cn 모든 권리 보유.</span><span>// ------------ - ------------------------------------------------- -</span><span>// | 라이선스 있음( http://www.apache.org/licenses/LICENSE-2.0 )</span><span>// -------------- ----- ------------------- ----- -</span><span>// | 작성자: liu21st <liu21st@gmail.com></span><span>// ---------------- ---------- -------------- ----------</span><span>/*** Think 시스템 기능 라이브러리*/</span><span>// 학생들은 지난 수업에서 thinkphp에서 미리 정의된 다양한 변수의 정의를 완료했습니다. </span><span>// 핵심은 다음과 같이 나눌 수 있습니다. </span><span>// 먼저 웹으로 로드해야 하는 프로젝트 문서에 대해 thinkphp는 dirname 메소드를 사용하여 결합해서 로드하세요 </span><span>// 특징은 /// /// 이런 슬래시 </span><span>// 임포트해야 하는 파일들, 즉 thinkphp 핵심 프레임워크 부분의 경우, 로딩 방식은 __DIR__ 방식을 채택하여 </span><span>// 로딩하는 것이 특징입니다\ \ 이러한 백슬래시</span><span>// ps 물론 이는 창 아래 방향을 기준으로 하여 두 경로로 나누어집니다. , 조상 app_PATH 및 think_PATH</span><span>// 두 번째: we can 기록할 것은 </span><span>// 프레임워크 프로그램으로서 실행 시간과 메모리 소비를 기록할 수 있어야 합니다. 스크립트가 있어서 망설임 없이 mirctime과 memory_get_usage를 켰습니다</span><span>/ / 이 순간이 시간과 기억의 시작점이 됩니다. </span><span>// 세 번째: 주목해야 할 점은 다음과 같습니다. </span><span>// const 및 정의를 사용하여 시스템 상수를 정의합니다. 그러나 느낌상 상수는 불변이어야 하므로 const</span>가 사용됩니다. <span>// 이는 완전히 수정되었음을 의미합니다. Define을 사용하면 사용자가 자신의 앱을 만들 때 수정할 수 있습니다. 시스템이 정의하기 전에 정의되었는지 확인합니다. </span><span>// const를 재정의할 방법은 없습니다. </span><span>// 요약하면 기본적으로 차이점은 없습니다. 이 둘은 사용법, 컴파일 차이입니다! </span><span>// 넷째: 시스템 사전 정의 변수[GPC] 및 텍스트 데이터 스트림 </span><span>// 기본적으로 이스케이프되지 않는다고 할 수 있습니다 </span> <span> // 다섯번째: php와 웹서버 cgi간 통신방식 해석</span><span>// 운영체제 해석 </span><span>// 명령줄 도구가 서버에서 벗어나는지 해석</span><span>// 여섯째: ROOT 및 _FILE_ 파일의 정의가 일관되지 않는 문제에 대응하여 플랫폼의 이식성을 높이기 위해 다중 플랫폼 정의를 재정의했습니다. </span><span>// 간단히 말해서 정의와 크로스 플랫폼 기능을 표준화했을 뿐입니다! </span><span>// 다음으로 이러한 공용 함수를 function.php 20151205</span><span>/*** 다중 레이어 컨트롤러 형식 인스턴스화: [resource://][module/]controller
 *<span> @param</span> string $name 리소스 주소
 *<span> @param</span> string $layer 제어 레이어 이름
 *<span> @param</span> 정수 $level 컨트롤러 레벨
 *<span> @return</span> ThinkController|false*/</span><span>// 이 함수는 다중 계층 컨트롤러를 수행합니다. 인스턴스화 기능은 내부 호출을 용이하게 하며 앱 애플리케이션을 작성할 때 거의 사용되지 않습니다.</span><span><span>함수</span><span>A</span><span>(<span>$name</span>,<span>$layer</span>=<span>''</span> ,<span>$level</span>=<span>0</span>)</span> {</span><span>static</span><span>$_action</span> = <span>배열</span>() ;<span>//단일 열 인스턴스화 모드를 구현하기 위해 여기에 정의된 정적 저장소 배열 </span><span>$layer</span> = <span>$layer</span>? : C(<span>'DEFAULT_C_LAYER' </span>); <span>//'DEFAULT_C_LAYER' => '컨트롤러', //기본 컨트롤러 레이어 이름</span><span>$level</span> = <span>$level</span>? 🎜>$layer<span> == C(</span>'DEFAULT_C_LAYER'<span>)?C(</span>'ControlLER_LEVEL'<span>):</span>1<span>) </span>/ / ' CONTROLLER_LEVEL' => 1,<span></span>if<span>(</span>isset<span>(</span>$_action<span>[</span>$name<span>.</span>$ 레이어<span>]))</span>// 수신 컨트롤러 및 해당 레벨에 따른 기본값: 컨트롤러 1 레벨 return<span></span>return<span></span>$_action<span>[</span>$name<span>.</span>$layer<span>];

    </span>$class<span> = parse_res_name(</span>$name<span>,</span>$layer<span>,</span>$level<span>) </span>// 전달된 컨트롤에 따라 디바이스 이름 레벨에서 해당 클래스 이름을 가져옵니다. 클래스 이름 <span></span>if<span>(class_exists(</span>$class<span>)) { </span>// 위의 경우 인스턴스화<span></span>$action<span> = </span>new<span></span>$class<span>() </span>// 인스턴스화<span></span>$_action; <span>[</span>$name<span>.</span>$layer<span>] = </span>$action<span>;</span>// 인스턴스화된 객체를 정적 배열에 저장 <span></span>return <span></span>$action<span>;</span>// 인스턴스화 상태 반환<span>
    }</span>그 외<span> {
        </span>반품<span></span>거짓<span>;
    }
    </span>// 예: $name = 'admin' 결과는 $class = AdminController.class.php 파일 아래의 AdiminController 클래스입니다. <span>
}
</span>// 요약: 사실 이는 전달한 $name을 기반으로 다양한 인스턴스화된 객체를 반환하는 것입니다. $name에 존재할 수 있는 옵션은 다음과 같습니다. <span></span>// A('[Project://][Group/]Module','Controller layer name') 현재 이 수준은 기본적으로 미사용. <span></span>// 구조 대기 중<span></span>// 학생 여러분, 오늘 계속합시다. 어제 우리는 실제로 다양한 매개변수를 기반으로 다양한 컨트롤러 클래스를 인스턴스화하는 기능적 함수인 함수 A에 대해 배웠습니다.<span></span>// 함수 A는 다양한 입력 매개변수를 변환하는 해당 클래스의 이름과 위치를 추가한다는 점에 유의하세요 <span></span>// 다음으로 함수 B의 함수를 살펴보겠습니다<span></span> /***행동을 수행하다
 *<span> @param<span> string $name 동작 이름
 *</span> @param<span> string $tag 태그 이름(동작 클래스를 전달할 필요가 없음)
 *</span> @param<span> 매개변수에 혼합된 $params가 전달되었습니다.
 *</span> @return<span> 무효*/</span></span><span>함수<span></span>B<span></span>(<span>$name<span>, </span>$tag<span> = </span>''<span>,&</span>$params<span>=NULL)</span> {</span></span>if<span>(</span>''<span>==</span> $태그<span>){
        </span>$name<span> .= </span>'행동'<span>;
    }
    </span>return<span> ThinkHook::exec(</span>$name<span>,</span>$tag<span>,</span>$params<span>);
}
</span>// 말 그대로 특정 동작을 수행하는 함수입니다 <span></span>// 해당 레이블이 없을 경우 기본 동작은 Hook 함수를 찾아서 실행하는 것입니다<span></span>// 또 한 가지 주목해야 할 점은 $params는 실제로 일반 복사 값이 아니라 가져온 값이라는 점입니다. 이런 방식으로 들어오는 매개변수는 반환하지 않고도 변경할 수 있습니다. <span></span>// Hook 기능의 특별한 상황에 따라 일반적으로 Addons 에서 구성합니다 <span></span>// 기본값은 $name 입니다. 동작 조합 <span></span>// 기본 실행 함수 실행 <span></span>// 파일 위치 "Addons\{$name}\{$name}Addon";<span></span>// $class = $name.'Behavior';<span></span>/ / $tag = 'run';<span></span>// return $addon->$tag($params);<span></span>// 정리하자면 사실 B 함수는 플러그인을 실행하려면 [내부/외부] 두 가지 플러그인의 시작 위치를 소개합니다. 시작 기능을 실행합니다. <span></span>// return $class->run(parameter);<span></span>// 계속해서 연구해 보겠습니다. 이 C 함수는 일반적으로 매우 일반적으로 사용되는 함수입니다. 건너뛰세요. 주의 깊게 공부해야 합니다 <span></span>//<span></span>/*** 구성 매개변수 획득 및 설정 및 배치 정의 지원
 *<span> @param<span> string|array $name 구성 변수
 *</span> @param<span> 혼합 $value 구성 값
 *</span> @param<span> 혼합 $default 기본값
 *</span> @return<span> 혼합됨*/</span></span><span>기능<span></span>C<span></span>(<span>$name<span>=null, </span>$value<span>=null,</span>$default<span>=null)</span> {</span></span>// 한 번만 초기화할 수 있는 초기화 컨테이너를 정의합니다. <span></span>static<span></span>$_config<span> = </span>array<span>();</span>// Classic static global 변수 등록은 다음과 같습니다. 실제로 여러 페이지를 다르게 로드하면 효과가 뚜렷하지 않습니다. 최적화가 가능한 곳입니다.<span>// 매개변수 없이 모든 사례 가져오기 1</span><span>if</span> (<span>empty</span>(<span>$name</span>)) { <span>// This 이는 큰 트릭입니다. 즉, C()를 호출할 때 내부가 비어 있으면 가족 전체가 반환된다는 점에 유의하십시오. </span><span>반품</span><span>$_config</span>;
    }
    <span>// 설정 획득 또는 할당 사례 2의 우선 실행</span><span>if</span> (is_string(<span>$name</span>)) { <span>// 문자열인 경우 배열의 형식을 따르지 않습니다</span><span>if</span> (!strpos(<span>$name</span>, <span>'.'</span>)) { <span>// 연결 기호가 없으면 2.1로 기록됩니다. 이는 다소 과하다고 생각되지만 배열의 저장 형식과의 호환성을 위한 것입니다. Liu 선배, 정말 쉽지 않네요. </span><span>$name</span> = strtoupper(<span>$name</span>) <span>// 어떤 문자든 모두 대문자인지는 중요하지 않습니다. 이는 실제로 처리하는 좋은 방법입니다. 호환성, 학생에게서 배울 수 있습니다! </span><span>if</span> (is_null(<span>$value</span>)) <span>// 실제로 나눌 수 있는데 여기서는 2.1.1로 기록됩니다</span><span>return</span><span>isset</span>(<span>$_config</span>[<span>$name</span>]) ? <span>$_config</span>[<span>$name</span>] : <span>$default</span> <span>// 여기서 삼항은 정말 영리하며 2.1.1.1과 2.1.1.2로 나눌 수 있습니다</span><span>$_config</span>[<span>$name</span>] = <span>$value</span>; <span>// 2.1.2로 표시됩니다. 이해하셨나요?</span><span>return</span><span>null</span> / /다양한 조건부 구분입니다<span></span>// 요약은 C('name','zhangsan')입니다. 즉, Zhang San에 이름을 할당합니다<span></span>// If $name = C ( 'name')은 이름 할당을 읽는 것입니다. 위 명령문이 방금 실행된 경우 <span></span>// $name은 Zhang San<span>입니다.
        }
        </span>// 2차원 배열 설정 및 검색 지원 <span></span>$name<span> =explore(</span>'.'<span>, </span>$name<span>) </span> // 이는 2차원 배열에 대한 지원만 추가하는 것입니다. 즉, 2차원 배열의 하위 요소가 대문자가 아닙니다. <span></span>$name<span>[</span>0 <span>] = strtoupper( </span>$name<span>[</span>0<span>]);
        </span>if<span> (is_null(</span>$value<span>))
            </span>반품<span></span>isset<span>(</span>$_config<span>[</span>$name<span>[</span>0<span>]][</span>$name<span>[</span>1<span>]]) ? </span>$_config<span>[</span>$name<span>[</span>0<span>]][</span>$name<span>[ </span>1<span>]] : </span>$default<span>;
        </span>$_config<span>[</span>$name<span>[</span>0<span>]][</span>$name<span>[</span>1<span>]] = </span> $값<span>;
        </span>반환<span></span>null<span>;
    }
    </span>// 일괄 설정 시나리오 3: 데이터를 직접 병합합니다. 사실 저처럼 IQ가 낮은 사람들은 잊어버리기 쉽기 때문에 자주 사용하지는 않습니다. <span></span>if<span> (is_array(</span>$name<span>)){
        </span>$_config<span> = array_merge(</span>$_config<span>, array_change_key_case(</span>$name<span>,CASE_UPPER));
        </span>반환<span></span>null<span>;
    }
    </span>// 기타 상황<span></span>return<span></span>null<span> </span>// 잘못된 매개변수 방지<span>
}
</span>// 네, 학생 여러분 감사합니다. 다음 수업에 계속하겠습니다! <span></span>// 사실 지난 강의에서 C 함수에 대해 이야기했습니다. 여기서는 구성 파일로 기능을 제한하지 마세요. D 함수 오늘은 이 함수 thinkphp 사용시 전체적으로 사용됩니다.<span>// Model 클래스를 인스턴스화하는 함수입니다 </span><span>/*** 모델 클래스 형식 인스턴스화 [resource://][module/]model
 *<span> @param</span> string $name 리소스 주소
 *<span> @param</span> string $layer 모델 레이어 이름
 *<span> @return</span> ThinkModel*/</span><span><span>function</span><span>D</span><span>(<span>$name</span>=<span>''</span>,<span>$layer</span>=<span>''</span>)</span> {</span><span>if</span>(<span>empty</span>(<span>$name</span>)) <span>return</span><span>new</span> ThinkModel <span>// 입력 매개변수가 비어 있으면 기본 Model</span><span>static</span><span>$_model</span> = <span>array</span>() <span>//를 직접 반환합니다. 그렇지 않으면 정적 인스턴스화 창고를 만들 수 있습니다. </span><span>$layer</span> = <span>$layer</span>? : C(<span>'DEFAULT_M_LAYER'</span>)// 여기서 기본 레이어를 확인하세요. <span></span>if<span>(</span>isset<span>(</span>$_model<span>[</span>$name<span>.</span>$layer<span>])) </span>/ / 동일 원칙이 존재한다면 return은 실제로는 단일 컬럼 <span></span>return<span></span>$_model<span>[</span>$name<span>.</span>$의 적용 아이디어입니다. 레이어<span>];
    </span>$class<span> = parse_res_name(</span>$name<span>,</span>$layer<span>) </span>//해당 클래스 이름을 구문 분석하여 가져오는 기능이 포함되어 있습니다. 예, 훌륭합니다 <span></span>if<span>(class_exists(</span>$class<span>)) { </span>// 존재하는 경우 직접 로드하고 인스턴스화합니다 <span></span>$ 모델 <span> = </span>새<span></span>$class<span>(기본 이름(</span>$name<span>));
    }</span>elseif<span>(</span>false<span> === strpos(</span>$name<span>,</span>'/'<span>)){ </span>// 다음과 같은 경우 아니요 클래스 파일을 찾았습니다. 즉, 클래스를 찾을 수 없습니다 <span></span>// 공개 모듈에서 모델을 자동으로 로드합니다 <span></span>if<span>(!C(</span>'APP_USE_NAMESPACE '<span>)){ </span>// 공개 모델이 지정되지 않은 경우 공개 모델에서 검색 <span>
            import(</span>'공통/'<span>.</span>$layer<span>.</span>'/'<span>.</span>$class<span>) </span>//기본 공개 모델 저장위치<span>
        }</span>그 외<span>{
            </span>$class<span> = </span>'\Common\'<span>.</span>$layer<span>.</span>'\'<span>.</span>$name<span>.</span>$layer<span>;</span>// 작동하지 않으면 기본 클래스를 인스턴스화하세요<span>
        }
        </span>$model<span> = class_exists(</span>$class<span>)? </span>new<span></span>$class<span>(</span>$name<span>) : </span> new<span> ThinkModel(</span>$name<span>);
    }</span>else<span> { </span>// 그렇지 않으면 로깅 오류 기본 클래스 인스턴스화 Return 반환 <span>
        ThinkLog::record(</span>'D 메서드 인스턴스화가 모델 클래스를 찾지 못했습니다.'<span>.</span>$class<span>,ThinkLog::NOTICE);
        </span>$model<span> = </span>new<span> ThinkModel(기본 이름(</span>$name<span>));
    }
    </span>$_model<span>[</span>$name<span>.</span>$layer<span>] = </span>$model<span> </span>// 기록 저장 <span></span> return<span></span>$model<span>;</span>// 클래스 3 인스턴스화의 현재 인스턴스화를 반환합니다<span>
}
</span>// 예외 발생은 기본적으로 캡슐화로 직접 전달되지만 핵심 코드에는 아무것도 없습니다. <span></span>// PHP의 기본 예외 클래스를 상속합니다. <span></span>/*** 예외 처리 발생
 *<span> @param<span> string $msg 예외 메시지
 *</span> @param<span> 정수 $code 예외 코드 기본값은 0입니다.
 *</span> @throws<span> ThinkException
 *</span> @return<span> 무효*/</span></span><span>함수<span></span>E<span></span>(<span>$msg<span>, </span>$code<span>=</span>0<span>)</span> {</span></span>던지기<span></span>새<span>생각 </span>예외<span>(</span>$msg<span>, </span>$code<span>);
}
</span>// 파일을 통한 빠른 데이터 저장과 읽기 작업의 문제입니다. <span></span>/*** 문자열 및 배열과 같은 간단한 데이터 유형에 대한 빠른 파일 데이터 읽기 및 저장
 *<span> @param<span> 문자열 $name 캐시 이름
 *</span> @param<span> 혼합 $value 캐시 값
 *</span> @param<span> string $path 캐시 경로
 *</span> @return<span> 혼합됨*/</span></span><span>기능<span></span>F<span></span>(<span>$name<span>, </span> $value<span>=</span>''<span>, </span>$path<span>=DATA_PATH)</span> {</span></span>static<span></span>$_cache<span> = </span>array<span>(); </span>// 이전 루틴과 동일하며 사용하기 쉬운 것 같습니다. <span></span>$filename<span> = </span>$path<span> . $ name</span> . <span>'.php'</span> <span>//파일 디렉토리도 매우 간단합니다.직접 사용하는 php 파일 </span><span>if</span> (<span>''</span> !== <span>$value</span>) { <span>// 값이 있는 경우 </span><span>if</span> (is_null(<span>$value</span>)) { <span>// 기존 값이 비어 있는 경우</span><span>// 캐시 삭제</span><span>if</span>(<span>false</span> !== strpos(<span>$name</span>,<span>'*'</span>)){ <span>// 저장된 객체에 * 기호가 있는 경우, 오류</span><span>반환</span><span>false</span> <span>// TODO</span>
            }<span>그 외</span>{
                <span>설정 해제</span>(<span>$_cache</span>[<span>$name</span>]);<span>//데이터 캐시 삭제</span><span>return</span> ThinkStorage::unlink (<span>$filename</span>,<span>'F'</span>) <span>//데이터 파일 삭제</span>
            }
        } <span>그밖에</span> {
            ThinkStorage::put(<span>$filename</span>,serialize(<span>$value</span>),<span>'F'</span>) <span>//직렬화를 사용하여 파일 쓰기 </span><span>// 캐시 데이터</span><span>$_cache</span>[<span>$name</span>] = <span>$value</span> <span>// 캐시에 쓰기 </span><span>반환</span><span>null</span>;
        }
    }
    <span>// 캐시 데이터 가져오기</span><span>if</span> (<span>isset</span>(<span>$_cache</span>[<span>$name</span>])) <span> // 일반 C와 매우 유사합니다. </span><span>return</span><span>$_cache</span>[<span>$name</span>];
    <span>if</span> (ThinkStorage::has(<span>$filename</span>,<span>'F'</span>)){ <span>// 기존 파일 읽기 </span><span> $value </span> = unserialize(ThinkStorage::read(<span>$filename</span>,<span>'F'</span>));
        <span>$_cache</span>[<span>$name</span>] = <span>$value</span> <span>// 데이터 반환</span>
    } <span>그밖에</span> {
        <span>$값</span> = <span>거짓</span>;
    }
    <span>반환</span><span>$value</span> <span>//데이터 반환</span>
}
// 지금 제가 말하는 애플리케이션의 위치를 ​​이해하셨나요?<span>// 함수 주석으로서 이 편지는 간결하고 명확합니다 </span><span>/*** 시간(마이크로초) 및 메모리 사용량에 대한 로깅 및 통계
 * 사용방법:
 * <코드>
 * G('begin'); // 시작 표시 비트 기록
 * // ...간격 실행 코드
 * G('end'); // 종료 태그 비트 기록
 * echo G('begin','end',6); // 통계 간격 실행 시간, 소수점 이하 6자리까지 정확, 시간은 숫자로 표시됨
 * echo G('begin','end','m'); //통계적 간격 메모리 사용량, 메모리는 m으로 표시됩니다.
 * 끝 표시 비트가 정의되지 않은 경우 현재 표시 비트가 자동으로 사용됩니다.
 * 통계적 메모리 사용량을 적용하려면 MEMORY_LIMIT_ON 상수가 true여야 합니다.
 * </코드>
 *<span> @param</span> 문자열 $start 시작 태그
 *<span> @param</span> 문자열 $end 종료 태그
 *<span> @param</span> 정수|문자열 $dec 소수점 자리 또는 m
 *<span> @return</span> 혼합됨*/</span><span>// 여기서는 thinkphp 창시자를 언급해야겠습니다 특히 사람들이 좋아하는 것 중 하나는 입력 매개변수에 따라 다른 의미를 구현하는 것입니다 </span><span>// C 함수, F 함수 등 매개변수가 하나만 입력되면 숫자, 매개변수 2개를 읽는다는 의미입니다. 세 개의 매개변수는 일반적으로 기본값을 추가합니다. </span><span>// number_format — 천 단위 구분 기호로 숫자 형식을 지정합니다. </span><span>// $nombre_format_francais = number_format($number, 2 , ',' , '');</span><span><span>함수</span><span>G</span><span>(<span>$start</span>,<span>$end</span> =<span> ''</span>,<span>$dec</span>=<span>4</span>)</span> {</span><span>정적</span><span>$_info</span> = <span>배열 </span>(); <span>// 시간 창고</span><span>정적</span><span>$_mem</span> = <span>배열</span>(); 메모리 창고입니다 <span></span>if<span>(is_float(</span>$end<span>)) { </span>// 전달된 값이 이렇다면 시간을 기록하세요 G('start',2342353234.453 ) ; 위 스타일과 일치하는 레코드일 뿐입니다 <span></span>// 소수점을 넣으면 끝납니다 <span></span>$_info<span>[</span>$start<span>] = </span>$ end<span>; </span>// 또는 전달된 값이 다음과 같은 경우 G('start',microtime(TRUE));<span>
    }</span>elseif<span>(!</span>비어 있음<span>(</span>$end<span>)){ </span>// 통계 시간 및 메모리 사용량, 즉 기본 우선 순위는 시간입니다<span></span>// 숫자 끝이 아닌 경우 차이 값을 반환<span></span>if<span>(!</span>isset<span>(</span>$_info<span>[</span>$end<span>])) </span>$_info<span>[</span>$end<span>] = microtime(</span>TRUE<span>);
        </span>if<span>(MEMORY_LIMIT_ON && </span>$dec<span>==</span>'m'<span>){ </span>// 메모리 로깅이 켜져 있고 분명히 메모리 기록인 경우<span> </span>if<span>(!</span>isset<span>(</span>$_mem<span>[</span>$end<span>])) </span>$_mem<span>[</span>$ end<span>] = memory_get_usage(); </span>// 메모리 기록 가져오기<span></span>return<span> number_format((</span>$_mem<span>[</span>$end<span> ]- </span>$_mem<span>[</span>$start<span>])/</span>1024<span>) </span>// 반환된 형식 값 가져오기<span>
        }</span>그 외<span>{
            </span>반환<span> number_format((</span>$_info<span>[</span>$end<span>]-</span>$_info<span>[</span>$start<span>]),</span>$dec<span>); </span>// 형식화된 자릿수를 반환하며 기본값은 소수점 4자리입니다<span>
        }

    }</span>else<span>{ </span>// 시간 및 메모리 사용량 기록<span></span>// 별도로 메모리와 타임 플래그를 동기적으로 기록합니다.<span>$_info</span>[<span>$start</span>] = 마이크로타임(<span>TRUE</span>);
        <span>if</span>(MEMORY_LIMIT_ON) <span>$_mem</span>[<span>$start</span>] = memory_get_usage();
    }
    <span>반환</span><span>null</span>;
}
<span>// H 기능 없음 </span><span>// 오늘 오전 인터뷰는 여기까지입니다. 감사합니다! </span><span>// 어제는 좀 급했습니다. 사실 이 G는 두 번째, 세 번째 매개변수의 속성을 뛰어넘는 기능입니다. 구별은 시간이나 다른 것을 기록하지만 어떻게 작동하든 시간은 메모리에 동시에 기록됩니다 </span><span>// 시간과 메모리의 기록은 PHP 프로그램의 성능을 한 각도에서 반영할 수 있습니다 </span><span>// 다음은 기본값 </span><span>/*** 입력 매개변수를 가져오고 필터링 및 기본값을 지원합니다.
 * 사용방법:
 * <코드>
 * I('id',0); id 매개변수를 가져오고 get 또는 post를 자동으로 결정합니다. // 글쎄요, 귀하가 제공한 이러한 예는 실제로 매우 일반적으로 사용됩니다.
 * I('post.name','','htmlspecialchars'); $_POST['name'] 가져오기
 * I('get.'); $_GET을 얻습니다.
 * </코드>
 *</span> @param<span> string $name 변수 이름은 지정된 유형을 지원합니다.
 *<span> @param</span> 혼합 $default 존재하지 않는 경우 기본값
 *<span> @param</span> 혼합 $filter 매개변수 필터링 방법
 *<span> @param</span> 혼합 $datas 얻을 추가 데이터 소스
 *<span> @return</span> 혼합됨*/<span></span></span>함수<span>나<span></span>(<span>$name</span>,<span>$default<span>=</span>''<span>,</span>$filter<span>=null,</span> $datas<span>=null)</span> {<span></span>// 1단계: 웨어하우스 지정 </span></span>정적<span></span>$_PUT<span> = </span>null<span>; </span>//기본 단일 데이터 웨어하우스<span></span>// 2단계: 입력 유형 결정<span></span>if<span>(strpos(</span>$name<span>,</span>' /'<span>)){ </span>//수정자 지정<span></span>목록<span>(</span>$name<span>,</span>$type<span>) = 폭발( </span>'/'<span>,</span>$name<span>,</span>2<span>);
    }</span>elseif<span>(C(</span>'VAR_AUTO_STRING'<span>)){ </span>// 문자열에 대한 기본 강제 변환 <span></span>// // 입력 변수가 자동으로 강제 변환되는지 여부 If 문자열에 대해 켜져 있는 경우 변수를 얻으려면 배열 변수를 변수 수정자에 수동으로 전달해야 합니다. <span></span>// 실제로 위의 기본값은 false입니다<span></span>$type<span> = </span>의' <span>;
    }
    </span>// 세 번째 단계: 데이터 소스 얻기 <span></span>// 세 번째 단계: 첫 번째 작은 단계: 데이터 소스 분해 <span></span>// 일반적인 프로그램에서는 위의 두 가지가 하나는 사용되지 않습니다. 즉, 지정된 데이터 유형이 기본적으로 지정되지 않습니다.<span>if</span>(strpos(<span>$name</span>,<span>'.'</span>)) { <span>//매개변수 소스 지정</span><span>list</span>(<span>$method</span>,<span>$name</span>) = 폭발(<span>'.'</span>,<span>$name</span>,<span>2</span> );
    }<span>else</span>{ <span>//기본값은 자동판단</span><span>$method</span> = <span>'param'</span>;
    }
    <span>// 세 번째 단계: 두 번째 작은 단계: 데이터 소스 연결 </span><span>// 데이터 소스 지정, 가장 일반적으로 사용되는 방법은 get post </span><span>switch</span>(strtolower (<span>$method</span>)) { <span>// 사실 이는 매우 고전적인 소문자 </span><span>case</span><span>'get'</span> 사용입니다.
            <span>$input</span> =& <span>$_GET</span>; <span>// </span><span>break</span>를 가져오는 것도 좋습니다.
        <span>사례</span><span>'게시물'</span> :
            <span>$input</span> =& <span>$_POST</span>;
            <span>휴식</span>;
        <span>케이스</span><span>'넣기'</span> :
            <span>if</span>(is_null(<span>$_PUT</span>)){
                parse_str(file_get_contents(<span>'php://input'</span>), <span>$_PUT</span>);
            }
            <span>$입력</span> = <span>$_PUT</span>;
<span>/*
POST 데이터 읽기
multipart/form-data 유형과 함께 사용할 수 없습니다.
php://입력 VS $HTTP_RAW_POST_DATA
POST 데이터 읽기 */</span><span>break</span>;
        <span>case</span><span>'param'</span> :<span>// 사실 이게 가장 비과학적입니다. 게으른 프로그래밍과 호환되기 위해서는 </span><span>스위치</span> (<span>$ _SERVER</span>[<span>'REQUEST_METHOD'</span>]) {
                <span>사례</span><span>'POST'</span>:
                    <span>$input</span> = <span>$_POST</span>;
                    <span>휴식</span>;
                <span>사례</span><span>'PUT'</span>:
                    <span>if</span>(is_null(<span>$_PUT</span>)){
                        parse_str(file_get_contents(<span>'php://input'</span>), <span>$_PUT</span>);
                    }
                    <span>$입력</span> = <span>$_PUT</span>;
                    <span>휴식</span>;
                <span>기본값</span>:
                    <span>$input</span> = <span>$_GET</span>;
            }
            <span>휴식</span>;
        <span>// 일반적으로 사용되는 세 가지 입력 획득 방법 GET POST PUT </span><span>case</span><span>'path'</span> : <span>// 실제로 경로 획득이 있으므로 절대 호출하지 않습니다. </span><span>$input</span> = <span>배열</span>()을 사용했습니다.
            <span>if</span>(!<span>비어 있음</span>(<span>$_SERVER</span>[<span>'PATH_INFO'</span>])){
                <span>$depr</span> = C(<span>'URL_PATHINFO_DEPR'</span>);<span>// 경로 구분 기호</span><span>//'URL_PATHINFO_DEPR' => PATHINFO 모드에서 각 매개변수 사이의 구분 기호는 </span><span>$input</span> =explore(<span>$depr</span>,trim(<span>$_SERVER</span>[<span>'PATH_INFO ')입니다. </span>],<span>$depr</span>));
            }
            <span>휴식</span>;
        <span>사례</span><span>'요청'</span> :
            <span>$input</span> =& <span>$_REQUEST</span>;
            <span>휴식</span>;
        <span>사례</span><span>'세션'</span> :
            <span>$input</span> =& <span>$_SESSION</span>;
            <span>휴식</span>;
        <span>케이스</span><span>'쿠키'</span> :
            <span>$input</span> =& <span>$_COOKIE</span>;
            <span>휴식</span>;
        <span>케이스</span><span>'서버'</span> :
            <span>$input</span> =& <span>$_SERVER</span>;
            <span>휴식</span>;
        <span>케이스</span><span>'전역'</span> :
            <span>$입력</span> =& <span>$GLOBALS</span>;
            <span>휴식</span>;
        <span>사례</span><span>'데이터'</span> :
            <span>$입력</span> =& <span>$데이터</span>;
            <span>휴식</span>;
        <span>기본값</span>:
            <span>반환</span><span>null</span>;
    }
    <span>// 4단계: 명시적으로 변수 가져오기 </span><span>// 4.1 모든 값 가져오기 ​​</span><span>if</span>(<span>''</span>==<span>$ name </span>) { <span>// 모든 변수 가져오기 </span><span>$data</span> = <span>$input</span>;
        <span>// 필터 기능으로 계속 필터링</span><span>$filters</span> = <span>isset</span>(<span>$filter</span>)?<span>$filter</span>:C (<span>'DEFAULT_FILTER'</span>);
        <span>if</span>(<span>$filters</span>) {
            <span>if</span>(is_string(<span>$filters</span>)){
                <span>$filters</span> = 폭발(<span>','</span>,<span>$filters</span>);
            }
            <span>foreach</span>(<span>$filters</span><span>as</span><span>$filter</span>){
                <span>$data</span> = array_map_recursive(<span>$filter</span>,<span>$data</span>) <span>// 매개변수 필터링</span>
            }
        }
        <span>// 4.2 지정된 값을 가져옵니다</span>
    }<span>elseif</span>(<span>isset</span>(<span>$input</span>[<span>$name</span>])) { <span>// 값에 값이 지정된 경우 작업 </span><span>$data</span> = <span>$input</span>[<span>$name</span>] <span>// 데이터 수집 완료</span><span>// 필터링 시작 </span><span>$filters</span> = <span>isset</span>(<span>$filter</span>)?<span>$filter</span>:C(<span>'DEFAULT_FILTER'</span> );
        <span>// 필터가 존재합니다 필터링 시작</span><span>if</span>(<span>$filters</span>) {
            <span>if</span>(is_string(<span>$filters</span>)){
                <span>if</span>(<span>0</span> === strpos(<span>$filters</span>,<span>'/'</span>)){
                    <span>if</span>(<span>1</span> !== preg_match(<span>$filters</span>,(string)<span>$data</span>)){ <span>// 필터 지원 일반 </span><span>// 일반 검증 지원 </span><span>return</span><span>isset</span>(<span>$default</span>) ? <span>$default</span> 🎜>널<span>;
                    }
                }</span>그 외<span>{
                    </span>$filters<span> = 폭발(</span>','<span>,</span>$filters<span>);
                }
            }</span>elseif<span>(is_int(</span>$filters<span>)){
                </span>$filters<span> = </span>배열<span>(</span>$filters<span>);
            }
            </span>//배열 필터링 수행<span></span>if<span>(is_array(</span>$filters<span>)){
                </span>foreach<span>(</span>$filters<span></span>as<span></span>$filter<span>){
                    </span>if<span>(function_exists(</span>$filter<span>)) {
                        </span>$data<span> = is_array(</span>$data<span>) ? array_map_recursive(</span>$filter<span>,</span>$data<span>) : </span>$filter<span> (</span>$data<span>) </span>//매개변수 필터링<span>
                    }</span>그 외<span>{
                        </span>$data<span> = filter_var(</span>$data<span>,is_int(</span>$filter<span>) ? </span>$filter<span> : filter_id(</span>$filter<span>));
                        </span>if<span>(</span>false<span> === </span>$data<span>) {
                            </span>반환<span></span>isset<span>(</span>$default<span>) ? </span>$default<span> : </span>null<span>;
                        }
                    }
                }
            }
        }
        </span>//출력 데이터 유형을 지정합니다.<span></span>if<span>(!</span>empty<span>(</span>$type<span>)){
            </span>스위치<span>(strtolower(</span>$type<span>)){
                </span>케이스<span></span>'a'<span>: </span>// 배열<span></span>$data<span> = (</span>배열<span>)</span>$data<span>;
                    </span>휴식<span>;
                </span>케이스<span></span>'d'<span>: </span>// 숫자<span></span>$data<span> = (int)</span>$data<span>;
                    </span>휴식<span>;
                </span>case<span></span>'f'<span>: </span>// 부동 소수점<span></span>$data<span> = (float)</span>$data<span>;
                    </span>휴식<span>;
                </span>case<span></span>'b'<span>: </span>// Boolean<span></span>$data<span> = (boolean)</span>$data<span>;
                    </span>휴식<span>;
                </span>케이스<span></span>의<span>: </span>// 문자열<span></span>기본값<span>:
                    </span>$data<span> = (문자열)</span>$data<span>;
            }
        }
        </span>//4.3 기본값 가져오기<span>
    }</span>else<span>{ </span>// 변수 기본값<span></span>$data<span> = </span>isset<span>(</span>$default<span>)?</span> $default<span>:</span>널<span>;
    }
    </span>// 마지막으로 데이터를 반환하기 전에 처리합니다. 즉, 배열인 경우 기본 필터 함수가 실행됩니다. <span>
    is_array(</span>$data<span>) && array_walk_recursive(</span>$data<span>,</span>'think_filter'<span>);
    </span>반환<span></span>$data<span>;
}
</span>// 요약하자면 사실 위의 함수를 분석하고 나면 대략적으로 다음과 같이 학습할 수 있습니다. <span></span>// 첫째: 첫 번째 단계와 유사하게 분기 코드를 단계별로 작성합니다. 1.1 1.2 두 번째 단계: 2.1 2.2 이렇게 <span></span>// 두 번째: 여전히 전통을 이어가고 있으며, 매개변수 조정을 통한 출력의 특징은 다양한 매개변수의 스타일이 서로 호환된다는 것입니다 <span> </span>// 셋째: 다양하고 편리한 필터 기능의 조합입니다. 정말 좋아요! <span></span>//좋아해요 하하! <span></span>// J 기능 없음 <span></span>// K 기능 없음 <span></span>// 이 L 기능을 접할 때 일반적으로 언어 구성에 사용됩니다.<span>/*** 언어 정의 가져오기 및 설정(대소문자 구분)
 *<span> @param</span> string|array $name 언어 변수
 *<span> @param</span> 혼합 $value 언어 값 또는 변수
 *<span> @return</span> 혼합됨*/</span><span><span>함수</span><span>L</span><span>(<span>$name</span>=null, <span>$value</span>=null)</span> {</span><span>static</span><span>$_lang</span> = <span>배열</span>();<span>// 이전 속도 , 정의 창고 </span><span>// 빈 매개변수는 모든 정의를 반환합니다 </span><span>// 세 가지 방법 </span><span>// 첫 번째 방법: 비어 있는 </span><span>if</span> ( <span>비어 있음</span>(<span>$name</span>)) <span>//이전 속도: 입력 없음 모두 반환</span><span>return</span><span>$_lang</span>;
    <span>// 언어 습득(또는 설정) 결정 </span><span>// 존재하지 않는 경우 모두 대문자 $name을 직접 반환 </span><span>// 문자열 </span><span> // 아니요. 두 가지 방법: 문자열을 사용한 다음 기본적으로 빈 배열을 세분화하고 여기서 반환되는 내용을 기억하세요. </span><span>if</span> (is_string(<span>$name</span>)) { <span>// 문자열인 경우 </span><span>$name</span> = strtoupper(<span>$name</span>) <span>// 1단계: 모두 대문자로 변환 </span> <span>if</span> (is_null(<span>$value</span>)){ <span>// 설정할지 읽을지 결정</span><span>return</span><span>isset</span>( <span>$_lang</span>[<span>$name</span>]) ? <span>$_lang</span>[<span>$name</span>] : <span>$name</span>; >// 정의와 함께 반환 정의, 정의 없음, 직접 반환 <span>
        }</span>elseif<span>(is_array(</span>$value<span>)){ </span>// 배열인 경우<span></span>// 지원 변수<span></span>$replace <span> = array_keys(</span>$value<span>); </span>//배열의 모든 키 이름을 포함하는 새 배열 반환: <span></span>foreach<span>(</span>$replace<span> </span>as<span> &</span>$v<span>){ </span>// 이 부분은 이해가 안가서 너무 복잡하네요 ㅎㅎ 이해되시면 아래로 답변 부탁드려요! 감사합니다<span></span>$v<span> = </span>'{$'<span>.</span>$v<span>.</span>'}'<span>;
            }
            </span>반환<span> str_replace(</span>$replace<span>,</span>$value<span>,</span>isset<span>(</span>$_lang<span>[</span>$name<span>]) ? </span>$_lang<span>[</span>$name<span>] : </span>$name<span>);
        }
        </span>$_lang<span>[</span>$name<span>] = </span>$value<span> </span>// 언어 정의는 <span></span>return<span></span>을 정의합니다. null<span>;
    }
    </span>// 일괄 정의<span></span>// 세 번째 방법: array<span></span>if<span> (is_array(</span>$name<span>)) </span>// 일괄 정의 array_change_key_case() 함수는 배열의 모든 키를 대문자 또는 소문자로 변환합니다. 기본 대문자<span></span>$_lang<span> = array_merge(</span>$_lang<span>, array_change_key_case(</span>$name<span>, CASE_UPPER));
    </span>반환<span></span>null<span>;
}
</span><span>함수</span><span>M<span></span>(<span>$name</span>=<span>''</span>, <span>$tablePrefix</span> = </span>''<span>,</span>$connection<span>=<span>''</span>)<span> {</span><span>정적<span></span>$_model<span> = </span>배열<span>();</span>// 불변 웨어하우스<span></span>if<span>(strpos(</span>$name<span>,</span>':'</span> )) { </span>// 코드를 결합하여 클래스로 연결할 수 있으며 그 뒤에 클래스 이름<span></span>list<span>(</span>$class<span>,</span>$name<span>) = 폭발(</span>':'<span>,</span>$name<span>);
    }</span>그 외<span>{
        </span>$class<span> = </span>'Think\Model'<span>; </span>// 그렇지 않으면 기본 Model 클래스 인스턴스화를 실행합니다<span>
    }
    </span>// 이는 고유한 값을 만드는 것과 같습니다<span></span>$guid<span> = (is_array(</span>$connection<span>)?implode(</span>''<span>,</span>$connection<span>):</span>$connection<span>).</span>$tablePrefix<span> . </span>$name<span> </span> $클래스<span>;
    </span>if<span> (!</span>isset<span>(</span>$_model<span>[</span>$guid<span>])) </span>// 단일 열 단일 열<span></span> $_model<span>[</span>$guid<span>] = </span>new<span></span>$class<span>(</span>$name<span>,</span>$tablePrefix<span>, </span>$connection<span>); </span>// 저장된 단일 열 인스턴스화<span></span>return<span></span>$_model<span>[</span>$guid<span>] ; </span>// 이에 대해서는 더 이상 말하지 않겠습니다.
}
<span>/*** 통계 설정 및 가져오기
 * 사용방법:
 * <코드>
 * N('db',1); // 데이터베이스 작업 횟수를 기록합니다.
 * N('read',1); // 읽은 횟수를 기록합니다.
 * echo N('db'); // 현재 페이지 데이터베이스의 작업 수를 가져옵니다.
 * echo N('read'); // 현재 페이지를 읽은 횟수를 가져옵니다.
 * </코드>
 *<span> @param</span> 문자열 $key는 위치를 식별합니다.
 *<span> @param</span> 정수 $step 단계 값
 *<span> @param</span> boolean $save 결과 저장 여부
 *<span> @return</span> 혼합됨*/</span><span><span>기능</span><span>N</span><span>(<span>$key</span>, <span>$step</span>=<span>0</span>,<span>$save</span>=false)</span> {</span><span>정적</span><span>$_num</span> = <span>배열</span>(); <span>// 창고</span><span>if</span> (!<span>isset</span>(<span>$_num</span>[<span>$key</span>]) ) { <span>// 현재 값이 설정되지 않은 경우 </span><span>$_num</span>[<span>$key</span>] = (<span>false</span> !== <span> $ save</span>)? S(<span>'N_'</span>.<span>$key</span>) : <span>0</span>// 스토리지가 설정되어 있으면 S 함수, 읽기 처리, 그렇지 않으면 0이 됩니다 <span>
    }
    </span>if<span> (</span>비어 있음<span>(</span>$step<span>)){ </span>// 단계 설정이 없는 경우<span></span>return<span></span> $_num<span>[</span>$key<span>];
    }</span>else<span>{ </span>// 그렇지 않으면 단계별로 진행<span></span>$_num<span>[</span>$key<span>] = </span>$_num<span> [</span>$key<span>] (int)</span>$step<span>;
    }
    </span>if<span>(</span>false<span> !== </span>$save<span>){ </span>// 결과를 저장합니다. 실제로는 캐시 기능을 통해 읽어옵니다. <span>
        S(</span>'N_'<span>.</span>$key<span>,</span>$_num<span>[</span>$key<span>],</span>$save<span>);
    }
    </span>반환<span></span>null<span>;
}
</span>// O 함수 없음 <span></span>// P 함수 없음 <span></span>// Q 함수 없음 <span></span>// 오늘은 L M N 함수 언어 패키지 M에 대해 이야기하면서 마치겠습니다. 인스턴스화는 인스턴스화 클래스 및 연결된 데이터베이스 N을 지정할 수 있습니다. 기록 단계 <span></span>// 죄송합니다. 혼란스럽습니다. 어제 업데이트가 없었고 오늘만 업데이트되었습니다 <span></span>/***컨트롤러 URL 매개변수 형식 [resource://][module/]controller/option의 작업 방법을 원격으로 호출합니다.
 *<span> @param<span> string $url 전화 주소
 *</span> @param<span> string|array $vars 호출 매개변수는 문자열과 배열을 지원합니다.
 *</span> @param<span> string $layer 호출할 컨트롤 레이어 이름
 *</span> @return<span> 혼합됨 */ </span></span>// 쿼리 문자열을 변수로 구문 분석합니다. <span></span>// parse_str() 함수는 쿼리 문자열을 변수로 구문 분석합니다. <span></span>// 참고: php.ini 파일의 Magic_quotes_gpc 설정은 이 함수의 출력에 영향을 미칩니다. 활성화되면 변수는 parse_str() 에 의해 구문 분석되기 전에 addlashes() 에 의해 변환됩니다. <span></span>/**pars_str("name=Bill&age=60");
echo $name."<br>";
에코 $ 나이;
 *
parse_str("name=Bill&age=60",$myArray);
print_r($myArray);*/<span></span>// print_r(pathinfo("/testweb/test.txt"));<span></span>// pathinfo()는 연관 배열에는 경로 정보가 포함되어 있습니다. <span></span>/**정렬
(
[디렉터리 이름] => /testweb
[기본 이름] => 테스트.txt
[확장자] => txt
)
 * [디렉터리 이름]
[기본 이름]
[확대]*/<span></span>/**클래스 A급
{
함수 bc($b, $c) {
$bc = $b $c;
에코 $bc;
}
}
call_user_func_array(array('ClassA','bc'), array("111", "222"));
//显示 333*/<span></span><span>기능<span></span>R<span></span>(<span>$url<span>,</span>$vars<span>=array</span>()<span>,</span>$layer<span>=</span>''<span>)</span> {</span></span>$info<span> = pathinfo(</span>$url<span>) </span>// 경로 구문 분석<span></span>$action<span> = </span>$info <span>[</span>'basename'<span>]; </span>// 파일 이름 가져오기 <span></span>$module<span> = </span>$info<span>[</span>'dirname ' <span>]; </span>// 파일 경로 가져오기 <span></span>$class<span> = A(</span>$module<span>,</span>$layer<span>); / / 위젯</span><span>if</span>(<span>$class</span>){ <span>// 클래스가 있는 경우</span>와 같은 한 단계 더 높은 관계로 실제 클래스 인스턴스화를 가져옵니다. <span>if </span>(is_string(<span>$vars</span>)) { <span>// 변수가 전달된 경우 </span>
            parse_str(<span>$vars</span>,<span>$vars</span>) <span>// 들어오는 매개변수를 배열로 구문 분석합니다</span>
        }
        <span>return</span> call_user_func_array(<span>배열</span>(&<span>$class</span>,<span>$action</span>.C(<span>'ACTION_SUFFIX'</span>)), <span>$vars</span>) <span>//</span>
    }<span>그 외</span>{
        <span>반품</span><span>거짓</span>;
    }
}
<span>// 정리하자면 사실 이 R은 url을 통해 직접 처리되는 call_user_func_array의 업그레이드 버전입니다. </span><span>// 오늘이 1시간 30분 남았습니다. 오늘의 공부 계속하기</span><span>// 이 함수는 사실 아주 멋진 함수인데 F함수를 사용해 보면 이 두 유령의 차이점이 무엇인지 살펴보겠습니다.</span><span>/*** 캐시 관리
 *<span> @param</span> 혼합 $name 캐시 이름, 배열 표현인 경우 캐시 설정
 *<span> @param</span> 혼합 $value 캐시 값
 *<span> @param</span> 혼합 $options 캐시 매개변수
 *<span> @return</span> 혼합됨*/</span><span><span>함수</span><span>S</span><span>(<span>$name</span>,<span> $value</span>=<span>''</span>,<span>$options</span>=null)</span> {</span><span>정적</span><span>$cache</span> = <span>''</span>; <span>// 창고 창고 창고는 창고입니다 </span><span>//첫 번째 단계: 초기화</span><span>if</span>(is_array(<span>$options </span>)){ <span>// 캐시 매개변수가 좀 지저분하다면 어떤 위치에든 배치할 수 있습니다 </span><span>// 캐시 작업을 동시에 초기화하는 것은 실제로는 초기화 과정입니다 </span> <span> $type</span> = <span>isset</span>(<span>$options</span>[<span>'type'</span>])?<span>$options</span>[<span> '유형' </span>]:<span>''</span>;
        <span>$cache</span> = ThinkCache::getInstance(<span>$type</span>,<span>$options</span>);
    }<span>elseif</span>(is_array(<span>$name</span>)) { <span>// 캐시 초기화// 캐시 매개변수가 실제로 약간 지저분하다면 어느 위치에나 배치할 수 있습니다 </span><span> $type</span> = <span>isset</span>(<span>$name</span>[<span>'type'</span>])?<span>$name</span>[<span>'유형' </span>]:<span>''</span>;
        <span>$cache</span> = ThinkCache::getInstance(<span>$type</span>,<span>$name</span>);
        <span>반환</span><span>$cache</span>;
    }<span>elseif</span>(<span>비어 있음</span>(<span>$cache</span>)) { <span>//아직 자동 초기화가 없는 경우</span><span>$cache</span> = ThinkCache::getInstance() <span>//초기화</span>
    }
    <span>//데이터를 기반으로 디자인</span><span>if</span>(<span>''</span>=== <span>$value</span>){ <span>// 캐시 가져오기</span><span>return</span><span>$cache</span>->get(<span>$name</span>) <span>// 데이터 가져오기</span>
    }<span>elseif</span>(is_null(<span>$value</span>)) { <span>// 캐시 삭제</span><span>return</span><span>$cache</span>-> rm(<span>$name</span>) <span>//데이터 삭제</span>
    }<span>else</span> { <span>// 캐시 데이터</span><span>if</span>(is_array(<span>$options</span>)) {
            <span>$expire</span> = <span>isset</span>(<span>$options</span>[<span>'expire'</span>])?<span>$options</span>[<span> '만료'</span>]:<span>NULL</span>;
        }<span>그 외</span>{
            <span>$expire</span> = is_numeric(<span>$options</span>)?<span>$options</span>:<span>NULL</span>;
        }
        <span>return</span><span>$cache</span>->set(<span>$name</span>, <span>$value</span>, <span>$expire</span>) <span>//데이터 저장</span>
    }
}

<span>// 정리하자면 이게 무슨 목적인가요? 핵심은 클래스 함수입니다 </span><span>// 사실 그 함수는 아무것도 아닙니다 </span><span>// 오늘 새로 배워보겠습니다. 템플릿 엔진</span><span>/*** 템플릿 파일 형식 가져오기 리소스://module@theme/controller/option
 *<span> @param</span> string $template 템플릿 리소스 주소
 *<span> @param</span> string $layer 뷰 레이어(디렉토리) 이름
 *<span> @return</span> 문자열*/</span><span><span>function</span><span>T</span><span>(<span>$template =</span>''<span>,</span>$layer<span>=</span>''<span>)</span>{</span></span>// 템플릿 리소스 주소를 구문 분석하는 첫 번째 단계 : <span></span>if<span>(</span>false<span> === strpos(</span>$template<span>,</span>'://'<span>)){
        </span>$template<span> = </span>'http://'<span>.str_replace(</span>':'<span>, </span>'/'<span>,</span>$template<span>);
    }
    </span>$info<span> = parse_url(</span>$template<span>); </span>// 2단계: 자신만의 배열로 구문 분석 <span></span>$file<span> = </span>$ info<span>[</span>'호스트'<span>].(</span>isset<span>(</span>$info<span>[</span>'경로'<span>])?</span>$ 정보<span>[</span>'경로'<span>]:</span>''<span>);
    </span>$module<span> = </span>isset<span>(</span>$info<span>[</span>'사용자'<span>])?</span>$info<span>[</span> 'user'<span>].</span>'/'<span>:MODULE_NAME.</span>'/'<span> </span>// 사용자 이름 확장<span></span>$extend<span> = </span>$info<span>[</span>'scheme'<span>]; </span>// 확장 파일 확장자 <span></span>$layer<span> = </span>$layer<span>? >$layer</span>:C(<span>'DEFAULT_V_LAYER'</span>); <span>// 레이어</span><span>// 현재 테마의 템플릿 경로 가져오기 </span><span>$auto </span> = C(<span>'AUTOLOAD_NAMESPACE'</span>);
    <span>if</span>(<span>$auto</span> && <span>isset</span>(<span>$auto</span>[<span>$extend</span>])){ <span>/ / 확장 리소스</span><span>$baseUrl</span> = <span>$auto</span>[<span>$extend</span>].<span>$module</span>.<span>$layer</span>.<span>'/'</span>;
    }<span>elseif</span>(C(<span>'VIEW_PATH'</span>)){
        <span>//모듈 보기 디렉터리 변경</span><span>$baseUrl</span> = C(<span>'VIEW_PATH'</span>);
    }<span>elseif</span>(정의됨(<span>'TMPL_PATH'</span>)){
        <span>//전역 보기 디렉터리 지정</span><span>$baseUrl</span> = TMPL_PATH.<span>$module</span>;
    }<span>그 외</span>{
        <span>$baseUrl</span> = APP_PATH.<span>$module</span>.<span>$layer</span>.<span>'/'</span>;
    }

    <span>// 테마 가져오기</span><span>$theme</span> = substr_count(<span>$file</span>,<span>'/'</span>)<<span>2</span> ? C(<span>'DEFAULT_THEME'</span>) : <span>''</span>;

    <span>//분석 템플릿 파일 규칙</span><span>$depr</span> = C(<span>'TMPL_FILE_DEPR'</span>);
    <span>if</span>(<span>''</span> == <span>$file</span>) {
        <span>// 템플릿 파일 이름이 비어 있으면 기본 규칙 </span><span>$file</span> = CONTROLLER_NAME <span>$depr</span> 에 따라 찾습니다.
    }<span>elseif</span>(<span>false</span> === strpos(<span>$file</span>, <span>'/'</span>)){
        <span>$file</span> = 컨트롤러 이름 . <span>$depr</span> . <span>$file</span>;
    }<span>elseif</span>(<span>'/'</span> != <span>$depr</span>){
        <span>$file</span> = substr_count(<span>$file</span>,<span>'/'</span>)><span>1</span> ? substr_replace(<span>$file</span> ,<span>$depr</span>,strrpos(<span>$file</span>,<span>'/'</span>),<span>1</span>) : str_replace(<span>'/'</span>, <span>$depr</span>, <span>$file</span>);
    }
    <span>반환</span><span>$baseUrl</span>.(<span>$theme</span>?<span>$theme</span>.<span>'/'</span>:<span>'' </span>).<span>$file</span>.C(<span>'TMPL_TEMPLATE_SUFFIX'</span>);
}
<span>// 정리하자면 사실 이 제품은 실제 URL 경로만 반환하는 제품입니다 </span><span>// 오늘은 새로 나온 조립제품입니다 </span><span>/**
 * URL 어셈블리는 다양한 URL 패턴을 지원합니다.
 *<span> @param</span> string $url URL 표현, 형식: '[모듈/컨트롤러/작업#anchor@도메인 이름]?parameter1=value1&parameter2=value2...'
 *<span> @param</span> string|array $vars가 매개변수로 전달되며 배열과 문자열을 지원합니다.
 *<span> @param</span> string|boolean $suffix 의사 정적 접미사, 구성 값을 얻으려면 기본값은 true입니다.
 *<span> @param</span> boolean $domain 도메인 이름 표시 여부
 *<span> @return</span> 문자열
 * 이 기능은 주어진 URL의 유효성을 확인하는 데 사용되지 않으며 아래 나열된 부분으로 나누는 데만 사용됩니다. 불완전한 URL도 허용되며,parse_url()은 이를 가능한 한 정확하게 구문 분석하려고 시도합니다.*정렬
(
[구성표] =>
[호스트] => 호스트 이름
[사용자] => 사용자 이름
[통과] => 비밀번호
[경로] => /경로
[쿼리] => arg=물음표 뒤의 값 ?
[fragment] => 해시 기호 뒤에 앵커 #
)
 * $url = 'http://username:password@hostname/path?arg=value#anchor';
 */</span><span><span>함수</span><span>U</span><span>(<span>$url</span>=<span>''</span>,<span>$vars</span>=<span>''</span>,<span>$suffix</span>=true,<span>$domain</span>=false)</span> {</span><span>// URL 구문 분석 실제로 여기 들어오는 URL은 일반 주소에 있는 사람의 URL이 아닙니다. 그는 그것을 다시 조립했는데 개인적으로 그것은 별로 과학적이지 않다고 생각합니다 </span><span>$info</span> =parse_url(<span>$url</span>) <span>/ / 여기의 파싱 방법은 일반적인 파싱 방법과 다릅니다</span><span>// 사례 1</span><span>// $url = 'Home/Index/index#zhangsan@www. maizi.net? name=lisi&age=32';</span><span>// var_dump(parse_url($url));</span><span>//배열(크기=2)</span><span>// '경로' = > string 'Home/Index/index' (길이=16)</span><span>// 'fragment' => string 'zhangsan@www.maizi.net?name=lisi&age=32' ( length=39) </span><span>// 사례 2</span><span>// $url = 'Home/Index/index@www.maizi.net?name=lisi&age=32';</span><span>// var_dump (parse_url($url));</span><span>// 배열(크기=2)</span><span>// 'path' => string 'Home/Index/index@www. maizi.net' (길이=30)</span><span>// 'query' => string 'name=lisi&age=32' (길이=16)</span><span>$url</span> = !<span>비어있음</span>(<span>$info</span>[<span>'경로'</span>])?<span>$info</span>[<span>'경로'</span>]:ACTION_NAME; <span>/ / 경로가 구문 분석된 경우 구문 분석된 경로를 사용하고, 그렇지 않으면 action_name을 사용합니다</span><span>if</span>(<span>isset</span>(<span>$info</span>[<span> 'fragment' </span>])) { <span>// 구문 분석 앵커는 웹사이트 </span><span>$anchor</span> = <span>$의 고정된 위치로 이동하는 웹페이지의 표시입니다. info</span>[<span> 'fragment'</span>]; <span>// 사실 이게 다 '[모듈/컨트롤러/작업#anchor@domain name]?매개변수 1=값 1&매개변수 2=값 2 ...'</span><span>if</span>(<span>false</span> !== strpos(<span>$anchor</span>,<span>'?'</span>)) { <span>// 앵커 포인트 뒤에 다음 매개변수 </span><span>list</span>(<span>$anchor</span>,<span>$info</span>[<span>'query'가 오는 경우 매개변수 구문 분석 </span>]) = 폭발(<span>'?'</span>,<span>$anchor</span>,<span>2</span>);
        }
        <span>if</span>(<span>false</span> !== strpos(<span>$anchor</span>,<span>'@'</span>)) { <span>//도메인 이름 확인 if 앵커를 클릭하면 @도메인 이름</span><span>list</span>(<span>$anchor</span>,<span>$host</span>)도 있습니다 = 폭발(<span>'@'</span>,<span>$anchor</span>, <span>2</span>);
        }
    }<span>elseif</span>(<span>false</span> !== strpos(<span>$url</span>,<span>'@'</span>)) { <span>//도메인 이름 확인 사용자 이름과 비밀번호를 도메인 이름으로 분할</span><span>list</span>(<span>$url</span>,<span>$host</span>) =explore(<span>'@'</span>,<span>$info</span>[<span>'경로'</span>], <span>2</span>);
        <span>// '[모듈/컨트롤러/작업@도메인 이름]? 매개변수 1=값 1&매개변수 2=값 2...' 불완전합니다</span>
    }
    <span>//하위 도메인 이름 호스트가 도메인 이름인지 확인</span><span>if</span>(<span>isset</span>(<span>$host</span>)) { <span>// 두 번째 아님 level 도메인 이름은 사실 일반적으로 그런 것이 없습니다 </span><span>// 사실 이 사용법은 매우 이상합니다. 일반적으로 $domain = $host 여기서는 </span><span>$domain</span> = <span>$host</span>.(strpos(<span>$host</span>,<span>'.'</span>)?<span>''</span>:strstr (<span>$ _SERVER</span>[<span>'HTTP_HOST'</span>],<span>'.'</span>));
    }<span>elseif</span>(<span>$domain</span>===<span>true</span>){ <span>//도메인 이름이 표시되어 추가되면 실제 부울 유형이 아닙니다. </span><span>$domain</span> = <span>$_SERVER</span>[<span>'HTTP_HOST'</span>] <span>//호스트 이름 도메인 이름 표시</span><span></span> (C(<span>'APP_SUB_DOMAIN_DEPLOY'</span>) ) { <span>// 하위 도메인 배포 활성화는 기본적으로 활성화되어 있지 않습니다. </span><span>$domain</span> = <span>$domain</span> == <span>'localhost'</span>?<span>'localhost'</span>:<span>'www'</span>.strstr(<span>$_SERVER</span>[<span>'HTTP_HOST'</span> ],<span>'.'</span>); <span>// 기본적으로 www.는 로컬이며 무시됩니다. =>array ('Module[/Controller]'); 실제로는 하위 도메인 이름 </span><span>foreach</span>에 대한 일치 규칙을 찾을 필요가 없을 수도 있습니다(C(<span>'APP_SUB_DOMAIN_RULES'</span>) <span>as</span><span>$key</span> => <span>$rule</span>) {<span>// 하위 도메인 규칙 처리</span><span>$rule</span> = is_array(<span>$rule</span>)?<span>$rule</span>[<span>0</span>]:<span>$rule</span>;
                <span>if</span>(<span>false</span> === strpos(<span>$key</span>,<span>'*'</span>) && <span>0</span>=== strpos(<span>$url</span>,<span>$rule</span>)) {
                    <span>$domain</span> = <span>$key</span>.strstr(<span>$domain</span>,<span>'.'</span>)// 해당 하위 도메인 이름 생성 <span></span>$url<span> = substr_replace(</span>$url<span>,</span>''<span>,</span>0<span>,strlen(</span>$rule<span> ) );
                    </span>휴식<span>;
                }
            }
        }
    }

    </span>// 매개변수 구문 분석 매개변수 구문 분석, 이는 나중에 전달되는 매개변수입니다. <span></span>if<span>(is_string(</span>$vars<span>)) { </span>// aaa=1&bbb= 2 배열로 변환<span>
        parse_str(</span>$vars<span>,</span>$vars<span>);
    }</span>elseif<span>(!is_array(</span>$vars<span>)){
        </span>$vars<span> = </span>배열<span>();
    }
    </span>// 매개변수 병합<span></span>if<span>(</span>isset<span>(</span>$info<span>[</span>'query'<span>])) { </span>//파싱된 주소의 매개변수를 vars로 병합<span>
        parse_str(</span>$info<span>[</span>'쿼리'<span>],</span>$params<span>);
        </span>$vars<span> = array_merge(</span>$params<span>,</span>$vars<span>);
    }

    </span>// 요약하자면 사실 첫 번째 단계는 분할<span></span>// 두 번째 단계: 어셈블리<span></span>// URL 어셈블리<span></span>$ depr<span> = C(</span>'URL_PATHINFO_DEPR'<span>); </span>//'/', // PATHINFO 모드에서 각 매개변수 사이의 구분 기호<span></span>$urlCase <span> = C(</span>'URL_CASE_INSENSITIVE'<span>); </span>//// 기본값 false는 URL이 대소문자를 구분함을 의미하고, true는 대소문자를 구분하지 않음을 의미합니다<span></span>// URL 주소가 있는 경우<span></span>if<span>(</span>$url<span>) {
        </span>if<span>(</span>0<span>=== strpos(</span>$url<span>,</span>'/'<span>)) {</span>// 경로 정의 팔로우 디렉토리<span></span>$route<span> = </span>true<span>;
            </span>$url<span> = substr(</span>$url<span>,</span>1<span>) </span>// 첫 번째 슬래시 제거 <span></span><span> (</span>'/'<span> != </span>$depr<span>) { </span>// 시스템이 지정한 간격 기호로 교체 <span></span>$url<span> = str_replace(</span>' /'<span>,</span>$depr<span>,</span>$url<span>);
            }
        }</span>else<span>{ </span>// 즉, 루트 디렉터리가 아닌 경우<span></span>if<span>(</span>'/'<span> != </span>$ depr <span>) { </span>// 안전한 교체<span></span>$url<span> = str_replace(</span>'/'<span>,</span>$depr<span>,</span>$ URL <span>);
            }<span>// 모듈, 컨트롤러 및 작업 구문 분석</span><span>$url</span> = Trim(<span>$url</span>,<span>$depr</span>) <span>// 제거 양쪽 끝의 공백 기호 </span><span>$path</span> =explore(<span>$depr</span>,<span>$url</span>) <span>// 경로 분석</span><span>$var</span> = <span>배열</span>();
            <span>$varModule</span> = C(<span>'VAR_MODULE'</span>); <span>// 'VAR_MODULE' => 'm', // 기본 모듈은 변수를 가져옵니다. </span><span>$ varController </span> = C(<span>'VAR_CONTROLLER'</span>); <span>//'VAR_CONTROLLER' => 'c', // 기본 컨트롤러는 변수 </span><span>$varAction</span>을 가져옵니다. = C(<span>'VAR_ACTION'</span>); <span>// 'VAR_ACTION' => 'a', // 기본 작업은 변수 </span><span>$var</span>[ <span>$varAction</span>] = !<span>비어있음</span>(<span>$path</span>)?array_pop(<span>$path</span>):ACTION_NAME; 방법 구문 분석 작업<span></span>$var<span>[</span>$varController<span>] = !</span>비어 있음<span>(</span>$path<span>)?array_pop(</span> $ path<span>):ControlLER_NAME;</span>// 위와 동일, 구문 분석 <span></span>if<span>(</span>$maps<span> = C(</span>'URL_ACTION_MAP'<span>)) { </span>// 기본적으로 정의된 라우팅 규칙이 없으므로 여기서는 실행되지 않습니다. <span></span>if<span>(</span>isset<span>(</span>$maps<span>[strtolower (</span>$var<span>[</span>$varController<span>])])) {
                    </span>$maps<span> = </span>$maps<span>[strtolower(</span>$var<span>[</span>$varController<span>])];
                    </span>if<span>(</span>$action<span> = array_search(strtolower(</span>$var<span>[</span>$varAction<span>]),</span>$maps<span>) ){
                        </span>$var<span>[</span>$varAction<span>] = </span>$action<span>;
                    }
                }
            }
            </span>if<span>(</span>$maps<span> = C(</span>'URL_ControlLER_MAP'<span>)) { </span>// 위와 동일<span></span>// $a= array( "a"=>"red","b"=>"green","c"=>"blue");<span></span>// echo array_search("red",$a ); <span></span>if<span>(</span>$controller<span> = array_search(strtolower(</span>$var<span>[</span>$varController<span>]),</span>$ 지도<span>)){
                    </span>$var<span>[</span>$varController<span>] = </span>$controller<span>;
                }
            }
            </span>if<span>(</span>$urlCase<span>) { </span>//대소문자 구분 여부에 관계없이 기본값은 true이므로 구별되지 않습니다. <span></span>$var <span>[</span>$varController <span>] = pars_name(</span>$var<span>[</span>$varController<span>]) </span>// 모두 통일된 형식으로 변환 <span>
            }
            </span>$module<span> = </span>''<span>; </span>//비우도록 초기화<span></span>if<span>(!</span>비어 있음<span>(</span>$ path<span>)) { </span>// 경로가 비어 있지 않은 경우<span></span>$var<span>[</span>$varModule<span>] = implode(</span>$depr<span> , </span>$경로<span>);
            }</span>그 외<span>{
                </span>if<span>(C(</span>'MULTI_MODULE'<span>)) { </span>// 여러 모듈이 활성화된 경우 // 여러 모듈을 허용할지 여부. false인 경우 DEFAULT_MODULE을 설정해야 합니다. <span></span> if<span>(MODULE_NAME != C(</span>'DEFAULT_MODULE'<span>) || !C(</span>'MODULE_ALLOW_LIST'<span>)){
                        </span>$var<span>[</span>$varModule<span>]= MODULE_NAME;
                    }
                }
            }
            </span>if<span>(</span>$maps<span> = C(</span>'URL_MODULE_MAP'<span>)) { </span>// 여기에도 라우팅을 설정하면 위와 동일 <span></span>if<span>(</span>$_module<span> = array_search(strtolower(</span>$var<span>[</span>$varModule<span>]),</span>$maps<span> )){
                    </span>$var<span>[</span>$varModule<span>] = </span>$_module<span>;
                }
            }
            </span>if<span>(</span>isset<span>(</span>$var<span>[</span>$varModule<span>])){ </span>// 위와 동일<span></span>$모듈<span> = </span>$var<span>[</span>$varModule<span>];
                </span>설정 해제<span>(</span>$var<span>[</span>$varModule<span>]);
            }

        }
    }
    </span>// 사실 실제 조합은 두 가지 방법이 있습니다. <span></span>// 도메인 이름 <span></span>//<span></span>(C(<span>' URL_MODEL'</span>) == <span>0</span>) { <span>// 일반 모드 URL 변환 </span><span>$url</span> = __APP__.<span>'?'</span>.C(<span>'VAR_MODULE'</span>).<span>"={$module}&"</span>.http_build_query(array_reverse(<span>$var</span>));
        <span>if</span>(<span>$urlCase</span>){ <span>//모두 소문자로 변환</span><span>$url</span> = strtolower(<span>$url</span>) ;
        }
        <span>if</span>(!<span>empty</span>(<span>$vars</span>)) { <span>// 매개변수가 비어 있지 않으면 </span><span>$ 매개변수를 추가합니다. vars</span> = http_build_query(<span>$vars</span>);
            <span>$url</span> .= <span>'&'</span>.<span>$vars</span>;
        }
    }<span>else</span>{ <span>//PATHINFO 모드 또는 호환 URL 모드</span><span>if</span>(<span>isset</span>(<span>$route</span>)) {<span>// 라우팅이 활성화된 경우 </span><span>$url</span> = __APP__.<span>'/'</span>.rtrim(<span>$url</span>,<span>$depr</span>);
        }<span>그 외</span>{
            <span>$module</span> = (정의됨(<span>'BIND_MODULE'</span>) && BIND_MODULE==<span>$module</span> ) <span>''</span> : <span>$module </span>;
            <span>$url</span> = __APP__.<span>'/'</span>.(<span>$module</span>?<span>$module</span>.MODULE_PATHINFO_DEPR:<span>''</span> ).implode(<span>$depr</span>,array_reverse(<span>$var</span>));
        }
        <span>if</span>(<span>$urlCase</span>){ <span>//Convert</span><span>$url</span> = strtolower(<span>$url</span>);
        }
        <span>if</span>(!<span>empty</span>(<span>$vars</span>)) { <span>// 매개변수 추가는 </span><span>foreach (</span>$vars<span></span>as<span></span>$var<span> => </span>$val<span>){
                </span>if<span>(</span>''<span> !== Trim(</span>$val<span>)) </span>$url<span> .= </span>$depr<span> . </span>$var<span> . </span>$depr<span> .urlencode(</span>$val<span>);
            }
        }
        </span>if<span>(</span>$suffix<span>) {</span>// 파일 접미사가 정의된 경우 <span></span>$suffix<span> = </span>$suffix<span>== =</span>참<span>?C(</span>'URL_HTML_SUFFIX'<span>):</span>$suffix<span>;
            </span>if<span>(</span>$pos<span> = strpos(</span>$suffix<span>, </span>'|'<span>)){
                </span>$suffix<span> = substr(</span>$suffix<span>, </span>0<span>, </span>$pos<span>);
            }
            </span>if<span>(</span>$suffix<span> && </span>'/'<span> != substr(</span>$url<span>,-</span>1<span>)){
                </span>$url<span> .= </span>'.'<span>.ltrim(</span>$suffix<span>,</span>'.'<span>);
            }
        }
    }
    </span>if<span>(</span>isset<span>(</span>$anchor<span>)){ </span>// <span></span>$url<span>에 앵커 조합이 있는 경우 . = </span>'#'<span>.</span>$앵커<span>;
    }
    </span>if<span>(</span>$domain<span>) { </span>// 도메인 이름 결합 <span></span>$url<span> = (is_ssl()?</span>'https: / /'<span>:</span>'http://'<span>).</span>$domain<span>.</span>$url<span>;
    }
    </span>반환<span></span>$url<span>;
}
</span>// V 기능 없음 <span></span>// 요약: <span></span>// 구문 분석_url 지시문은 URL 주소를 파싱하는 함수입니다 <span></span>// 사실 이런 생각이 듭니다. 함수가 다릅니다. 복잡합니다. 서로 다른 입력 URL 메서드를 자체 메서드로 구문 분석한다는 의미입니다 <span></span>// 일반적으로 사용되는 것은 U('Home/Index/index',array('name'=>'lijingshan입니다) ','age'=>'12'));<span></span>// 기본적으로 도메인 이름과 앵커는 사용되지 않지만 이 둘은 그래도 좋습니다 ㅎㅎ 파싱이 복잡하지는 않지만 , 결합하면 라우팅 규칙이 약간 어려웠습니다. <span></span>// 좋아요, 오늘은 계속합니다 <span></span>// 이 함수는 실제로 패키지입니다 <span></span>/*** 렌더링 출력 위젯
 *<span> @param<span> string $name 위젯 이름
 *</span> @param<span> 매개변수에 전달된 배열 $data
 *</span> @return<span> 무효*/</span></span><span> 함수<span></span>W<span></span>(<span>$name<span>, </span>$data<span>=array</span>()<span>)</span> {</span> </span>return<span> R(</span>$name<span>,</span>$data<span>,</span>'위젯'<span>);
}
</span>// X 기능 없음 <span></span>// Y 기능 없음 <span></span>// Z 기능 없음 <span></span>// 26 문자 기능이 종료되었습니다. <span></span> // 함수 A에서 호출되는 함수<span></span>/**
 * 리소스 주소를 구문 분석하고 클래스 라이브러리 파일을 가져옵니다.
 * 예: 모듈/컨트롤러 addon://module/behavior
 *<span></span></span></code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.